Problem:我们必须加密某个表(Postgres)上的某个列。它必须可以在 SQL 查询中解密and在我们的nodejs/sequelize应用程序层中。加密可以发生在任一层,但必须可以从任一层进行解码。
我遇到的问题(我确信这是用户错误)是,如果我在数据库中加密,我只能在数据库中解密,对于节点也是如此。
我尝试过使用PGP_SYM_ENCRYPT
and ENCRYPT
在 postgres 和crypto
and crypto-js/aes
在节点中。我已经得到它的解密没有错误,但返回乱码。
到目前为止我尝试过的一些事情(测试键是thirtytwocharsthirtytwocharsplus
):
set() {
this.setDataValue('field', seq.cast(seq.fn('PGP_SYM_ENCRYPT', val,
config.AES_KEY), 'text'))
}
这正确地写入了字段,以便 PGP_SYM_DECRYPT 将解密它,但是(显然?)没有办法告诉 Sequelize 用函数调用包装字段名称,所以我觉得有很多额外的 js 是可以避免的
const decipher = crypto.createDecipher('aes256', config.AES_KEY)
decipher.setAutoPadding(false);
return decipher.update(new Buffer(this.getDataValue('field', 'binary'), 'binary', 'ascii')) + decipher.final('ascii')
这将解码该字段但返回乱码(�Mq��8Ya�b
) 而不是值 (test
)
aes.encrypt('test', config.AES_KEY)
aes.decrypt(field, config.AES_KEY).toString(CryptoJS.enc.Utf8)
这可以很好地加密,解密也很好,但是在尝试解密时会出现 Postgres 错误(使用PGP_SYM_DECRYPT
or DECRYPT
)。将结果字段投射到::TEXT
并将其粘贴到在线 AES 解密器中会返回预期值。
I really希望避免向我们的节点存储库/查询添加一堆样板,我真的觉得这应该可行。使用相同的加密算法应该产生相同的结果
任何轻推或指示将不胜感激