如何在Windows平台上使用Node.js创建加密的SQLite3数据库

8
我希望制作一个使用sqlite3作为数据库的小型electron应用程序。我已经安装了sqlite3。npm install sqlite3并使用node-gyp重新构建,以便与electron一起使用,现在一切都很顺利。
现在我想加密数据库,特别是在Windows平台上如何操作?

回答如何加密数据库的问题,取决于为什么需要加密。因为有不同的方法来加密数据库或者只是其中的数据(在某些表和/或行中)。 - tsturzl
我想对数据库文件进行密码保护,以防止他人窃听该文件。 - manas
@manas,请查看下面的答案。 - Thaadikkaaran
@manas,你最终在Windows上使用了哪个Electron解决方案? - wuno
4个回答

14

是的,这个问题有点老了,但如果还有人需要答案,这可能会对他们有所帮助。

您可以使用@journeyapps/sqlcipher在electron应用程序中启用sqlite3数据库的加密。

如果您使用任何JavaScript ORM sequelize,则可以像下面显示的那样配置它以使用@journeyapps/sqlcipher作为sqlite3数据库引擎。

const sequelize = new Sequelize(null, null, 'your-encryption-key', { dialect: 'sqlite', dialectModulePath: '@journeyapps/sqlcipher', storage: 'path/to/db.sqlite' })

这对我有效 :)

这里是一个示例应用程序,它使用带有sqlchiper包装器的sqlite3。


很棒的参考和代码示例。我为这个答案点赞 :) - ymz

2
默认情况下,Sqlite没有提供加密数据库文件的方法。尝试加密会带来很多问题。您需要使用类似AES256的加密算法对文件进行加密,然后在访问时解密该文件,这意味着您必须在某处保留一个未加密的版本。您可以将其保存在内存中,但较大的数据库可能无法放入内存中,而且您还需要在SQLite库中实现此操作。您可以创建一个临时文件,但这意味着未加密版本可以在任何时候访问数据库,如果应用程序意外崩溃,则该文件可能无法清除,从而导致数据暴露。
有一些工具如sqlitecrypt或sqlitecipher可以加密您的数据库,但它们是sqlite的替代品。它们实现了相同的API,但通常是sqlite的分支。 node-sqlite3模块支持构建sqlitecipher,如此处所示。
可以在数据库中加密数据。您需要使用密码生成密钥,然后加密每个列中的数据。将密钥的密码设置为用户要用于解锁数据的密码。这并不隐藏数据库结构,我认为只有当您要加密少量数据列时,才会考虑此方法。因为您仍然需要索引字段才能查询数据。这对于像密码管理器这样的东西非常有用,其中用户名和密码是加密字段,与用户/密码配对相关联的名称描述其用途。您将能够按凭据名称查询,但只有通过密码才能访问用户名和密码。

1
经过大量的测试,我发现better-sqlite3是一个几乎无瑕疵的库,用于为Node.js和Electron添加SQLite3支持。因此,我已经创建了一个扩展分支,支持多种加密算法,如SQLCiphersqleet(ChaCha20-Poly1305),并且可以直接使用SQLite3MultipleCiphers。它经过了充分的测试,速度快,几乎和原始库一样完美。
在这里尝试一下:https://www.npmjs.com/package/better-sqlite3-multiple-ciphers

0

我使用了:

我的个人应用程序使用“NODE JS”和ORM“SEQUELIZE”编写的代码:
更多信息https://sequelize.org/master/

const db_user = new Sequelize(
        database: "sdb",
        username: "",
        password: "mysecret",
        options: {
         dialect: "sqlite",
         dialectModulePath: '@journeyapps/sqlcipher',
         storage: "src/dbs/securedb.db",
       }
    );

    // SQLCipher config
    db_user.query("PRAGMA cipher_compatibility = 4");
    /*db_user.query("PRAGMA cipher_use_hmac = ON");
    db_user.query("PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA1");
    db_user.query("PRAGMA cipher_hmac_algorithm = HMAC_SHA1");
    db_user.query("PRAGMA cipher_page_size = 4096");
    db_user.query("PRAGMA cipher  = 'aes-256-cbc'");
    db_user.query("PRAGMA kdf_iter = 256000");
    db_user.query("PRAGMA cipher_plaintext_header_size = 0");*/
    db_user.query("PRAGMA key = 'mysecret'");

    async function connect(){
        try {
            await db_user.authenticate();
            return console.log('Connection has been established successfully.');
        } catch (error) {
            return console.error('Unable to connect to the database:', error);
        }
    }

    function loadModels(){
        var MdUser = db_user.define("user",{
            id: {
                type: DataTypes.INTEGER,
                autoIncrement: true,
                allowNull: false,
                unique: true,
                primaryKey: true
            },
            name:{
                type: DataTypes.STRING,
                allowNull: false
            }
        });

        db_user.sync(
            //{ force: true }
            { alter: true }
        );
     }

     connect()
        .then(loadModels())

使用DB-Browser-SQLite https://sqlitebrowser.org,您可以打开新的/定义的SQL-chiper数据库。

  1. 输入密码(例如我的密码是“mysecret”)
  2. 默认SQLCipher 4。
  3. 准备好使用。

您可以使用Win10上的HexDump Viewer进行比较/验证结果。https://www.saltybrine.com/hexdump32.htm

  1. 安装此应用程序。
  2. 打开加密数据库。(您将看到许多奇怪的字符,但没有人类可读的单词)
  3. 打开并比较未加密的数据库,您将看到内部指令/数据单词。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接