使用after* before*挂钩对加密字段进行序列化查询



嘿,我有一个关于在我的数据库中存储加密数据的最佳方法的问题。我使用Node.js,一个MySQL数据库,并将6.6.5序列化为ORM。

我是这样做的:

  • 与beforeCreate和beforeUpdate钩子我加密我的数据
  • 使用beforeFind钩子,我加密了之前查询的条件这样做。
  • 和afterCreate, afterUpdate和afterFind钩子我解密
    数据后,创建更新或查询它。

但是查询本身给我带来了一些问题,我认为这些问题与我加密数据的方式有关。我使用Node.js加密模块与aes-256-cbc算法和一个随机IV表示每个加密。对于随机IV,每次加密都会得到不同的字符串。这就是为什么即使我使用beforeFind钩子来加密我的条件,查询也永远不会返回任何结果。

myModel.create({myField: "someData"}); 
// with the beforeCreate hook encrypting this the database will contain something like this
// myField: "1ac4e952cf6207e5fd79630e0e82c901"

myModel.findAll({ where: { myField: "someData" } });
// The beforeFind hook encrypts this condition but as mentioned the result is not the same 
// as the encrpyted value in the database
// It will look something like this:
// { where: { myField: "e203a4e22cf654w5fd7390300ef2c2f2" } }
// Because "1ac4e952cf6207e5fd79630e0e82c901" != "e203a4e22cf654w5fd7390300ef2c2f2"
// the query results in null

我显然可以使用相同的IV来加密我的数据,然后导致相同来源的每个加密导致相同的加密字符串,但如果有任何其他方法使其像这样工作,我宁愿不这样做。

基本上我的两个问题是:

是否有一种方法可以使用随机IV进行加密?或者是否有更好的方法将加密的数据存储在数据库中?

提前感谢大家!

随机(盐)的目的部分是为了防止你想要做的事情。

我不确定你的用例,但有时没有盐加密是可以的(相同的数据=>相同的哈希值),有时(想想用户密码)绝对不ok.

从你发布的我不知道你在哪里保存随机部分,否则你如何解密数据?

最新更新