如何在windows平台上使用nodejs创建加密的sqlite3数据库

时间:2015-10-27 08:32:44

标签: node.js encryption sqlite

我想创建一个使用sqlite3作为数据库的小型electron应用。我已经安装了sqlite3。 npm install sqlite3并使用node-gyp重建它,以便将它与电子一起使用到目前为止一切顺利。

现在我想加密数据库如何做到这一点,特别是在Windows平台

3 个答案:

答案 0 :(得分:1)

默认情况下,Sqlite不提供加密数据库文件的方法。尝试这样做会带来很多问题。您必须使用AES256等加密文件,然后在您想要访问文件时必须解密该文件,这意味着您必须在某处保留解密版本。您可以将其保留在内存中,但是较大的数据库可能不适合内存,您还需要在SQLite库中实现它。您可以创建一个临时文件,但这意味着只要数据库正在使用,就可以访问解密版本,并且如果您的应用程序意外崩溃,该文件可能无法清除,从而导致数据暴露。

有一些像sqlitecrypt或sqlitecipher这样的东西可以加密你的数据库,但它们是sqlite的替代品。它们实现相同的API,但它们通常是sqlite的分支。 node-sqlite3模块支持为sqlitecipher构建,如图here所示。

可以加密数据库中的数据。您需要生成带密码的密钥,然后加密每列中的数据。将密钥上的密码短语设置为您希望用户用来解锁数据的密码短语。这并不会隐藏数据库的结构,我只会认为当你有几列你需要加密的数据时,这将是一个实际的解决方案,因为你仍然需要索引字段,以便能够查询数据。这对于像密码管理器这样的东西很有用,其中用户名和密码是加密字段,并且有一个与用户/密码对相关联的名称,用于描述它的用途。您可以通过凭据名称进行查询,但只能通过密码访问用户名和密码。

答案 1 :(得分:1)

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

您可以使用@journeyapps/sqlcipher通过电子应用在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' })

这对我有用:)

Here是使用sqlite3和sqlchiper包装器的示例应用程序。

答案 2 :(得分: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. 放置密码。 (我的案例“我的秘密”)
  2. 默认 SQLCipher 4。
  3. 随时可用。

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

  1. 安装此应用。
  2. 打开一个加密数据库。 (你会看到很多磨损字符,但没有人字可读)
  3. 打开并比较 NO 加密数据库,您将看到内部指令/数据字。