รหัสผ่านป้องกัน SQLite DB เป็นไปได้ไหม?


88

ฉันต้องเผชิญกับโครงการเล็ก ๆ น้อย ๆ ใหม่ จะมีประมาณ 7 หรือ 9 ตารางตารางที่ใหญ่ที่สุดจะเติบโตขึ้นโดยอัตราสูงสุด 1,000 แถวต่อเดือน

ฉันคิดว่า SQLite เป็นฐานข้อมูลของฉัน ... แต่ฉันจะต้องปกป้องฐานข้อมูลในกรณีที่มีใครต้องการเปลี่ยนข้อมูลจากฐานข้อมูล

คำถามหลักของฉันคือ:

รหัสผ่านเป็นไปได้หรือไม่ที่จะป้องกันฐานข้อมูล sqlite เหมือนที่คุณทำในการเข้าถึง

คุณจะแนะนำ RDBMS อะไรอีกสำหรับโซลูชันขนาดเล็กเช่นนี้

การพัฒนาจะอยู่ใน C # แต่ฉันกำลังค้นหาบางอย่างฟรี


2
คุณอาจต้องการตรวจสอบSQLiteCrypt
Mike Buckbee


หากคุณจำเป็นต้องล็อก / ปลดล็อกฐานข้อมูลบ่อยๆสำหรับการดีบักลองใช้เครื่องมือนี้goo.gl/12VnQd
Mangesh

คุณสามารถค้นหาวิธีแก้ปัญหาได้ที่นี่ป้อนคำอธิบายลิงก์ที่นี่
Ishwar Rimal

คำตอบ:


72

คุณสามารถใช้รหัสผ่านป้องกัน SQLite3 DB ก่อนดำเนินการใด ๆ ให้ตั้งรหัสผ่านดังนี้

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

ครั้งต่อไปคุณสามารถเข้าถึงได้เช่น

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

สิ่งนี้จะไม่อนุญาตให้ตัวแก้ไข GUI ดูข้อมูลของคุณ ผู้แก้ไขบางคนสามารถถอดรหัสฐานข้อมูลได้หากคุณระบุรหัสผ่าน อัลกอริทึมที่ใช้คือ RSA

ในภายหลังหากคุณต้องการเปลี่ยนรหัสผ่านให้ใช้

conn.ChangePassword("new_password");

ในการรีเซ็ตหรือลบรหัสผ่านให้ใช้

conn.ChangePassword(String.Empty);

เครื่องมือฟรีเพียงอย่างเดียวที่ฉันพบจนถึงตอนนี้ที่จะเปิดฐานข้อมูลที่มีการป้องกันด้วยรหัสผ่านเช่นนี้คือSQLite2009 Pro ที่มีรายละเอียดในคำตอบนี้
JumpingJezza

ตัวอย่างนี้คือภาษาอะไร? ดูเหมือนว่า. NET?
PIM

1
ในทางเทคนิค. NET คือเฟรมเวิร์ก C # คือภาษาที่แสดงที่นี่
vapcguy

นอกจากนี้คุณต้องระมัดระวังในการอัปเดตสตริงการเชื่อมต่อก่อนการเปิดครั้งถัดไปทุกครั้งที่คุณเปลี่ยนรหัสผ่านมิฉะนั้นคุณอาจพบข้อผิดพลาด: stackoverflow.com/questions/16030601/…
vapcguy

โปรดทราบว่าหากไม่มีรหัสผ่านให้ Open () จะไม่ล้มเหลวในฐานข้อมูล SQLite ที่ป้องกันด้วยรหัสผ่านอย่างที่คุณคาดหวัง! สิ่งที่ล้มเหลวคือข้อมูลที่ตามมาหรือการดำเนินการเมตาดาต้าในไฟล์ที่เปิดนั้น
Cristi S.

33

คุณสามารถใช้การเข้ารหัสในตัวของผู้ให้บริการ sqlite .net (System.Data.SQLite) ดูรายละเอียดเพิ่มเติมได้ที่http://web.archive.org/web/20070813071554/http://sqlite.phxsoftware.com/forums/t/130.aspx

ในการเข้ารหัสฐานข้อมูลที่ไม่ได้เข้ารหัสที่มีอยู่หรือเปลี่ยนรหัสผ่านของฐานข้อมูลที่เข้ารหัสให้เปิดฐานข้อมูลจากนั้นใช้ฟังก์ชัน ChangePassword () ของ 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");

ในการถอดรหัสการเรียกฐานข้อมูลเข้ารหัสที่มีอยู่ChangePassword()ด้วยNULLหรือ""รหัสผ่าน:

// 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);

เปิดฐานข้อมูลการเข้ารหัสที่มีอยู่หรือการสร้างฐานข้อมูลการเข้ารหัสใหม่ระบุรหัสผ่านในส่วนConnectionStringดังแสดงในตัวอย่างก่อนหน้านี้หรือโทรฟังก์ชั่นก่อนที่จะเปิดใหม่SetPassword() SQLiteConnectionรหัสผ่านที่ระบุในข้อความที่ConnectionStringต้องเคลียร์ แต่รหัสผ่านที่ระบุในSetPassword()ฟังก์ชันอาจเป็นอาร์เรย์ไบต์ไบนารี

// 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

โดยค่าเริ่มต้นคีย์เวิร์ด ATTACH จะใช้คีย์เข้ารหัสเดียวกันกับฐานข้อมูลหลักเมื่อแนบไฟล์ฐานข้อมูลอื่นเข้ากับการเชื่อมต่อที่มีอยู่ ในการเปลี่ยนลักษณะการทำงานนี้คุณใช้ตัวปรับเปลี่ยนคีย์ดังต่อไปนี้:

หากคุณกำลังแนบฐานข้อมูลที่เข้ารหัสโดยใช้รหัสผ่าน cleartext:

// 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();

ในการแนบฐานข้อมูลที่เข้ารหัสโดยใช้รหัสผ่านไบนารี:

// 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
คำตอบที่เชื่อมโยงอย่างเดียวนี้เป็นตัวอย่างที่ชัดเจนว่าเหตุใดเราจึงไม่ทำคำตอบแบบลิงก์เท่านั้นที่ SO ลิงก์จริงหายไป มันไม่มีอีกแล้ว เหตุผลเดียวที่เราสามารถมองเห็นไซต์ได้เนื่องจากเว็บไซต์ถูกเก็บถาวรโดย web.archive.org
Hanlet Escaño

ไม่ทำงานอีกต่อไปไม่พบฟังก์ชันดังกล่าวในเวอร์ชันล่าสุด
MindRoasterMir

12

ใช้ SQLCipher ซึ่งเป็นส่วนขยาย opensource สำหรับ SQLite ที่ให้การเข้ารหัสไฟล์ฐานข้อมูล AES 256 บิตแบบโปร่งใส http://sqlcipher.net


2
แล้วความเร็วล่ะ? ถ้าฉันใช้ sqlcipher มันจะลดประสิทธิภาพหรือไม่?
TomSawyer

6

คุณสามารถเข้ารหัสฐานข้อมูล SQLite ของคุณด้วย SEE addon วิธีนี้ช่วยป้องกันการเข้าถึง / แก้ไขโดยไม่ได้รับอนุญาต

อ้างถึงเอกสาร SQLite:

SQLite Encryption Extension (SEE) เป็นเวอร์ชันปรับปรุงของ SQLite ที่เข้ารหัสไฟล์ฐานข้อมูลโดยใช้ AES 128 บิตหรือ 256 บิตเพื่อช่วยป้องกันการเข้าถึงหรือแก้ไขโดยไม่ได้รับอนุญาต ไฟล์ฐานข้อมูลทั้งหมดถูกเข้ารหัสเพื่อให้ผู้สังเกตการณ์ภายนอกไฟล์ฐานข้อมูลดูเหมือนจะมีสัญญาณรบกวนสีขาว ไม่มีสิ่งใดที่ระบุไฟล์ว่าเป็นฐานข้อมูล SQLite

คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับส่วนเสริมนี้ได้ในลิงค์นี้


7
ส่วนขยายนั้นยังเป็นส่วนเสริมที่จ่ายให้กับ sqlite
John Boker

3

ทางเลือกหนึ่งที่จะVistaDB อนุญาตให้ฐานข้อมูล (หรือแม้แต่ตาราง) ได้รับการป้องกันด้วยรหัสผ่าน (และเข้ารหัสทางเลือก)


1
มีวิธีที่มีประสิทธิภาพและฟรีมากกว่านี้!
สวรรค์

1
@MSS แต่ - อย่างที่ฉันบอกไปว่าโซลูชัน VistaDB มีข้อดีบางประการรวมถึงการเข้ารหัสแยกต่างหากในระดับตารางแทนที่จะเป็นการเข้ารหัสการเชื่อมต่อฐานข้อมูลแบบเต็ม ฉันไม่รู้จักตัวเลือกเนทีฟ. NET อื่น ๆ ที่ทำสิ่งนี้ได้ นอกจากนี้ยังมีการจัดการที่บริสุทธิ์ซึ่งแตกต่างจากตัวเลือกอื่น ๆ ส่วนใหญ่เพียงเพราะมันไม่ฟรีไม่ได้หมายความว่ามีตัวเลือกที่มีประสิทธิภาพหรือดีกว่า แต่ขึ้นอยู่กับความต้องการในการใช้งานอย่างสมบูรณ์
Reed Copsey

3

หากคุณใช้FluentNHibernateคุณสามารถใช้รหัสการกำหนดค่าต่อไปนี้:

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);
        }
}    

วิธีการใช้FileWithPassword (ชื่อไฟล์รหัสผ่าน)เข้ารหัสไฟล์ฐานข้อมูลและตั้งรหัสผ่าน
จะทำงานเฉพาะเมื่อมีการสร้างไฟล์ฐานข้อมูลใหม่ อันเก่าที่ไม่ได้เข้ารหัสจะล้มเหลวเมื่อเปิดด้วยวิธีนี้


2

ฉันรู้ว่านี่เป็นคำถามเก่า แต่วิธีแก้ปัญหาง่ายๆไม่ใช่แค่ปกป้องไฟล์ในระดับ OS หรือไม่? เพียงแค่ป้องกันไม่ให้ผู้ใช้เข้าถึงไฟล์จากนั้นพวกเขาก็ไม่ควรแตะต้องมัน นี่เป็นเพียงการคาดเดาและฉันไม่แน่ใจว่านี่เป็นทางออกที่ดีหรือไม่


2
ฉันไม่แน่ใจว่านั่นเป็นทางออกที่ดีหรือไม่เพราะใครก็ตามที่มีแท่ง USB สามารถบูตเข้าสู่ระบบปฏิบัติการอื่นและอ่านไฟล์ได้
nurettin

ฉันคิดว่านั่นเป็นเรื่องที่ยุติธรรม แต่ในกรณีนั้นให้ปิดการใช้งาน USB หากบางคนสามารถเข้าถึงเครื่องของคุณได้มีสิ่งอื่น ๆ อีกมากมายที่สามารถทำได้
David Price

คุณต้องการที่จะปกป้องข้อมูลที่สำคัญเพื่อให้เพียงสิ่งอื่น ๆ เหล่านั้นจะไปอย่างผิดปกติ
tripleee

ด้วยฐานข้อมูล SQLite สิ่งนี้ไม่สามารถทำได้เลย คุณต้องให้ผู้ใช้สามารถอ่านและเขียนได้ซึ่งหมายถึง ACL ของโฟลเดอร์ที่ SQLite DB อาศัยอยู่เพื่อให้อนุญาตสิทธิ์เหล่านั้นด้วย คุณสามารถรักษาความปลอดภัยจากผู้ที่ไม่ใช่ผู้ใช้โดยอนุญาตให้เฉพาะสิทธิ์ผู้ใช้จริงในโฟลเดอร์นั้น แต่คุณยังมี
vapcguy

1

ทำไมคุณต้องเข้ารหัสฐานข้อมูล? ผู้ใช้สามารถแยกชิ้นส่วนโปรแกรมของคุณและค้นหาคีย์ได้อย่างง่ายดาย หากคุณกำลังเข้ารหัสสำหรับการถ่ายโอนเครือข่ายให้พิจารณาใช้ PGP แทนการบีบเลเยอร์การเข้ารหัสลงในเลเยอร์ฐานข้อมูล


6
ผู้ใช้อาจถูกถามรหัสผ่านเมื่อเริ่มต้นระบบดังนั้นจึงไม่มีคีย์ใดที่สามารถทำได้โดยการแยกส่วนโปรแกรม
kgadek

1
ใช้ Redgate Reflector หรือ ILSpy
Zev Spitz

4
ทำไมคุณถึงใส่คีย์ลงในโปรแกรม? คุณจะไม่ทำเช่นนั้นสร้างรหัสจากรหัสผ่านผู้ใช้และใช้รหัสนั้นจากนั้นคุณไม่ต้องการความลับใด ๆ ในซอร์สโค้ดของคุณ
จรจัด
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.