Postgres 和 Node 之间的加密/解密

CJ *_*son 5 encryption postgresql aes node.js

问题:我们必须加密某个表(Postgres)上的某个列。它必须在 SQL 查询我们的 Nodejs/sequelize 应用程序层中可解密。加密可以发生在任一层中,但必须可以从任一层中解码。

\n\n

我遇到的问题(我确信这是用户错误)是,如果我在数据库中加密,我只能在数据库中解密,对于节点也是如此。

\n\n

我尝试过在 postgres 和node中使用PGP_SYM_ENCRYPTand 。我已经得到它的解密没有错误,但返回乱码。ENCRYPTcryptocrypto-js/aes

\n\n

到目前为止我尝试过的一些事情(测试键是thirtytwocharsthirtytwocharsplus):

\n\n
set() {\n  this.setDataValue('field', seq.cast(seq.fn('PGP_SYM_ENCRYPT', val, \n  config.AES_KEY), 'text'))\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这正确地写入了字段,使得 PGP_SYM_DECRYPT 能够解密它,但是(显然?)没有办法告诉 Sequelize 用函数调用包装字段名称,所以我觉得有很多额外的 js 是可以避免的

\n\n
const decipher = crypto.createDecipher('aes256', config.AES_KEY)\ndecipher.setAutoPadding(false);\nreturn decipher.update(new Buffer(this.getDataValue('field', 'binary'), 'binary', 'ascii')) + decipher.final('ascii')\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将解码该字段,但返回乱码 ( \xef\xbf\xbdMq\xef\xbf\xbd\xef\xbf\xbd8Ya\xef\xbf\xbdb) 而不是值 ( test)

\n\n
aes.encrypt('test', config.AES_KEY)\naes.decrypt(field, config.AES_KEY).toString(CryptoJS.enc.Utf8)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这可以很好地加密,解密也很好,但是 Postgres 在尝试解密时会出错(使用 或PGP_SYM_DECRYPTDECRYPT。将结果字段转换::TEXT并粘贴到在线 AES 解密器中会返回预期值。

\n\n

真的想避免向我们的节点存储库/查询添加一堆样板,而且我真的觉得这应该可行。使用相同的加密算法应该产生相同的结果

\n\n

任何推动或指示将不胜感激

\n

CJ *_*son 0

好的,我已经成功了,希望能正常工作

我所做的是:

使用crypto.createCipheriv('aes-256-cbc', new Buffer(config.AES_KEY), iv)in node、encrypt_ivpgsql 加密并存储hex在 db 中,并使用crypto.createDecipheriv/解密decrypt_ivtext/utf8

我不知道我错过了哪一部分,但在指定aes256、使用iv方法和翻转十六进制/文本之间它似乎有效。