我想创建一个使用sqlite3作为数据库的小型electron应用。我已经安装了sqlite3。 npm install sqlite3
并使用node-gyp重建它,以便将它与电子一起使用到目前为止一切顺利。
现在我想加密数据库如何做到这一点,特别是在Windows平台
答案 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 数据库。
您可以使用 HexDump Viewer 比较/验证结果。
在 Win10 上使用 https://www.saltybrine.com/hexdump32.htm