Mật khẩu Bảo vệ DB SQLite. Có khả thi không?


87

Tôi phải đối mặt với một dự án nhỏ mới. Nó sẽ có khoảng 7 hoặc 9 bảng, bảng lớn nhất trong số đó sẽ phát triển với tốc độ tối đa là 1000 hàng một tháng.

Tôi đã nghĩ về SQLite như db của mình ... Nhưng tôi sẽ cần phải bảo vệ db trong trường hợp có ai đó muốn thay đổi dữ liệu từ db

Câu hỏi chính của tôi là:

Có thể mật khẩu bảo vệ db sqlite như cách bạn làm khi truy cập không?

Bạn muốn giới thiệu RDBMS nào khác cho một giải pháp nhỏ như vậy?

Sự phát triển sẽ dựa trên C #, nhưng tôi đang tìm kiếm thứ gì đó miễn phí.


2
Bạn có thể muốn xem SQLiteCrypt
Mike Buckbee


Nếu bạn cần phải khóa / mở khóa DB thường xuyên để gỡ lỗi, hãy thử công cụ này goo.gl/12VnQd
Mangesh

Bạn có thể tìm ra giải pháp ở đây nhập mô tả liên kết ở đây
Ishwar Rimal

Câu trả lời:


72

Bạn có thể bảo vệ bằng mật khẩu cho SQLite3 DB. Trước khi thực hiện bất kỳ thao tác nào, hãy đặt mật khẩu như sau.

SQLiteConnection conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;");
conn.SetPassword("password");
conn.Open();

thì lần sau bạn có thể truy cập nó như

conn = new SQLiteConnection("Data Source=MyDatabase.sqlite;Version=3;Password=password;");
conn.Open();

Điều này sẽ không cho phép bất kỳ trình chỉnh sửa GUI nào xem dữ liệu của bạn. Một số trình soạn thảo có thể giải mã DB nếu bạn cung cấp mật khẩu. Thuật toán được sử dụng là RSA.

Sau này nếu bạn muốn thay đổi mật khẩu, hãy sử dụng

conn.ChangePassword("new_password");

Để đặt lại hoặc xóa mật khẩu, hãy sử dụng

conn.ChangePassword(String.Empty);

Công cụ miễn phí duy nhất mà tôi tìm thấy cho đến nay sẽ mở cơ sở dữ liệu được bảo vệ bằng mật khẩu như thế này là SQLite2009 Pro được trình bày chi tiết trong câu trả lời này .
JumpingJezza

Ví dụ này là lang gì? Có vẻ như .NET?
pim 27/12/15

1
Về mặt kỹ thuật, .NET là một khuôn khổ. C # là ngôn ngữ được hiển thị ở đây.
vapcguy

Ngoài ra, bạn phải cẩn thận với việc cập nhật chuỗi kết nối trước khi mở tiếp theo mỗi khi bạn thay đổi mật khẩu hoặc bạn có thể kết thúc đối mặt với lỗi: stackoverflow.com/questions/16030601/...
vapcguy

Lưu ý rằng, không có mật khẩu được cung cấp, Open () sẽ KHÔNG bị lỗi trên cơ sở dữ liệu SQLite được bảo vệ bằng mật khẩu, như bạn mong đợi! Điều không thành công là bất kỳ dữ liệu hoặc hoạt động siêu dữ liệu tiếp theo nào trên tệp đang mở đó.
Cristi S.

33

Bạn có thể sử dụng mã hóa tích hợp sẵn của nhà cung cấp sqlite .net (System.Data.SQLite). Xem thêm chi tiết tại http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx

Để mã hóa cơ sở dữ liệu chưa được mã hóa hiện có hoặc để thay đổi mật khẩu của cơ sở dữ liệu được mã hóa , hãy mở cơ sở dữ liệu và sau đó sử dụng hàm ChangePassword () của SQLiteConnection:

// Opens an unencrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
// Encrypts the database. The connection remains valid and usable afterwards.
cnn.ChangePassword("mypassword");

Để giải mã một lệnh gọi cơ sở dữ liệu được mã hóa hiện cóChangePassword() bằng một NULLhoặc ""mật khẩu:

// Opens an encrypted database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3;Password=mypassword");
cnn.Open();
// Removes the encryption on an encrypted database.
cnn.ChangePassword(null);

Để mở một cơ sở dữ liệu được mã hóa hiện có hoặc để tạo một cơ sở dữ liệu được mã hóa mới, hãy chỉ định một mật khẩu ConnectionStringnhư được hiển thị trong ví dụ trước hoặc gọi SetPassword()hàm trước khi mở một mật khẩu mới SQLiteConnection. Mật khẩu được chỉ định trong ConnectionStringphải là văn bản rõ ràng, nhưng mật khẩu được cung cấp trong SetPassword()hàm có thể là mảng byte nhị phân.

// Opens an encrypted database by calling SetPassword()
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.SetPassword(new byte[] { 0xFF, 0xEE, 0xDD, 0x10, 0x20, 0x30 });
cnn.Open();
// The connection is now usable

Theo mặc định, từ khóa ATTACH sẽ sử dụng cùng một khóa mã hóa làm cơ sở dữ liệu chính khi đính kèm tệp cơ sở dữ liệu khác vào kết nối hiện có. Để thay đổi hành vi này, bạn sử dụng công cụ sửa đổi KEY như sau:

Nếu bạn đang đính kèm cơ sở dữ liệu được mã hóa bằng mật khẩu văn bản rõ ràng:

// Attach to a database using a different key than the main database
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY 'mypassword'", cnn);
cmd.ExecuteNonQuery();

Để đính kèm cơ sở dữ liệu được mã hóa bằng mật khẩu nhị phân:

// Attach to a database encrypted with a binary key
SQLiteConnection cnn = new SQLiteConnection("Data Source=c:\\test.db3");
cnn.Open();
cmd = new SQLiteCommand("ATTACH DATABASE 'c:\\pwd.db3' AS [Protected] KEY X'FFEEDD102030'", cnn);
cmd.ExecuteNonQuery();

2
Thực tế, câu trả lời chỉ liên kết này là một ví dụ rõ ràng tại sao chúng tôi không thực hiện các câu trả lời chỉ liên kết tại SO. Liên kết thực tế đã biến mất; nó không tồn tại nữa. Lý do duy nhất chúng tôi có thể nhìn thấy trang web là vì nó được web.archive.org lưu trữ tự động.
Hanlet Escaño

Nó không hoạt động nữa, không tìm thấy các chức năng như vậy trong các phiên bản mới nhất.
MindRoasterMir

12

Sử dụng SQLCipher, đây là một phần mở rộng nguồn mở cho SQLite cung cấp mã hóa AES 256-bit minh bạch cho các tệp cơ sở dữ liệu. http://sqlcipher.net


1
Làm thế nào về tốc độ? Nếu tôi sử dụng sqlcipher nó có làm giảm hiệu suất không?
TomSawyer

6

Bạn có thể mã hóa cơ sở dữ liệu SQLite của mình bằng addon XEM. Bằng cách này, bạn ngăn chặn việc truy cập / sửa đổi trái phép.

Trích dẫn tài liệu SQLite:

Phần mở rộng Mã hóa SQLite (XEM) là phiên bản nâng cao của SQLite mã hóa các tệp cơ sở dữ liệu bằng 128-bit hoặc 256-Bit AES để giúp ngăn truy cập hoặc sửa đổi trái phép. Toàn bộ tệp cơ sở dữ liệu được mã hóa để đối với người quan sát bên ngoài, tệp cơ sở dữ liệu dường như chứa nhiễu trắng. Không có gì xác định tệp là cơ sở dữ liệu SQLite.

Bạn có thể tìm thêm thông tin về addon này trong liên kết này .


7
tiện ích mở rộng đó cũng là một addon phải trả phí cho sqlite.
John Boker

3

Một tùy chọn sẽ là VistaDB . Chúng cho phép cơ sở dữ liệu (hoặc thậm chí cả bảng) được bảo vệ bằng mật khẩu (và được mã hóa tùy chọn).


1
Có nhiều cách hiệu quả và miễn phí!
Sawan

1
@MSS Nhưng - như tôi đã nói, giải pháp VistaDB có một số ưu điểm, bao gồm mã hóa riêng biệt ở cấp bảng thay vì mã hóa toàn bộ kết nối DB. Tôi biết không có tùy chọn gốc .NET nào khác thực hiện được điều này. Nó cũng được quản lý thuần túy, không giống như hầu hết các tùy chọn khác - chỉ vì nó không miễn phí không có nghĩa là có nhiều tùy chọn hiệu quả hơn hoặc tốt hơn - nó hoàn toàn phụ thuộc vào yêu cầu sử dụng.
Reed Copsey

3

cho câu hỏi của bạn về mật khẩu bảo vệ db sqlite của bạn, tôi không nghĩ rằng nó có thể được thực hiện.

bạn có thể mã hóa nó mặc dù, đây là một số thông tin về điều đó:

http://sqlcrypt.com/

đó là $ 149 cho mỗi nền tảng.


3

Nếu bạn dùng FluentNHibernate, bạn có thể sử dụng mã cấu hình sau:

private ISessionFactory createSessionFactory()
{
    return Fluently.Configure()
            .Database(SQLiteConfiguration.Standard.UsingFileWithPassword(filename, password))
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<DBManager>())
            .ExposeConfiguration(this.buildSchema)
            .BuildSessionFactory();    
}

private void buildSchema(Configuration config)
{
        if (filename_not_exists == true)
        {
            new SchemaExport(config).Create(false, true);
        }
}    

Phương pháp usingFileWithPassword (tên tệp, mật khẩu) mã hóa tệp cơ sở dữ liệu và đặt mật khẩu.
Nó chỉ chạy nếu tệp cơ sở dữ liệu mới được tạo. Cái cũ không được mã hóa không thành công khi được mở bằng phương pháp này.


2

Tôi biết đây là một câu hỏi cũ nhưng có phải giải pháp đơn giản là chỉ bảo vệ tệp ở cấp hệ điều hành không? Chỉ ngăn người dùng truy cập tệp và sau đó họ sẽ không thể chạm vào tệp. Đây chỉ là một phỏng đoán và tôi không chắc liệu đây có phải là một giải pháp lý tưởng hay không.


2
Tôi không chắc đó có phải là một giải pháp tốt hay không vì bất kỳ ai có thẻ USB đều có thể khởi động vào hệ điều hành khác và đọc các tệp.
nurettin

Tôi nghĩ đó là điểm hợp lý, nhưng trong trường hợp đó, hãy tắt USB. Nếu một số người có quyền truy cập vật lý vào máy của bạn thì có rất nhiều thứ khác có thể được thực hiện.
David Price

Bạn muốn bảo vệ dữ liệu nhạy cảm để chỉ những thứ khác gặp trục trặc.
tripleee

Với cơ sở dữ liệu SQLite, điều này thực sự KHÔNG thể thực hiện được. Bạn cần người dùng có thể vừa đọc VÀ vừa ghi vào nó, nghĩa là ACL của thư mục mà SQLite DB tồn tại cũng phải cho phép họ những quyền đó. Bạn có thể bảo mật nó trước những người không phải là người dùng bằng cách chỉ cho phép người dùng thực quyền vào thư mục đó, nhưng bạn vẫn có "mối đe dọa nội gián".
vapcguy

1

Tại sao bạn cần mã hóa cơ sở dữ liệu? Người dùng có thể dễ dàng tháo rời chương trình của bạn và tìm ra chìa khóa. Nếu bạn đang mã hóa nó để truyền mạng, thì hãy cân nhắc sử dụng PGP thay vì ép một lớp mã hóa vào một lớp cơ sở dữ liệu.


6
Người dùng có thể được yêu cầu nhập mật khẩu khi khởi động vì vậy sẽ không có khóa nào có thể đạt được bằng cách tháo rời chương trình.
kgadek

1
Sử dụng Redgate Reflector, hoặc ILSpy.
Zev Spitz

4
Tại sao bạn lại đặt chìa khóa vào chương trình? bạn sẽ không làm điều đó, hãy tạo một khóa từ mật khẩu người dùng và sử dụng nó, sau đó bạn không cần bất kỳ bí mật nào trong mã nguồn của mình.
trampster
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.