我使用加密包执行以下操作:
- crypto.generateKeyPairSync()生成publicKey和privateKey
- 我只创建了一次密钥,并将它们存储在.env文件
- crypto.publicEncrypt()在将数据存储到数据库之前对其进行加密
- crypto.privateDecrypt()解密数据以呈现在HTML页面上(在html页面上渲染数据只是为了检查数据是否已正确存储,稍后我会在登录期间使用privateDecrypt来检查pw是否有效)。
我的本地计算机:
- 我能够加密数据并将其存储在DB
- 解密数据并在HTML上呈现
但是,如果我尝试解密AWS EC2实例上的数据,我会得到以下错误:error:040A1079:rsa例程:RSA_padding_check_PKCS1_OAEP_mgf1:oaep解码错误。
我很困惑,因为我正在使用完全相同的键,完全相同的代码和完全相同的DB。在本地可以正常工作的东西在AWS上不起作用。这里有什么问题呢?
const { generateKeyPairSync } = require('crypto');
const { publicKey, privateKey } = generateKeyPairSync('rsa', {
modulusLength: 4096,
publicKeyEncoding: {
type: 'spki',
format: 'pem'
},
privateKeyEncoding: {
type: 'pkcs8',
format: 'pem',
cipher: 'aes-256-cbc',
passphrase: 'top secret'
}
const ENCRYPTED_pw = crypto.publicEncrypt(
{
key: PUBLIC_KEY,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
oaepHash: "sha256",
},
Buffer.from(body.pw)
);
//convert Array Buffer to String
let encryptedPW = ENCRYPTED_pw.toString("base64");
//INSERT data into DB HERE
//GET data from DB HERE
let decryptedPhoneNum = crypto.privateDecrypt(
{
key: PRIVATE_KEY,
padding: crypto.constants.RSA_PKCS1_OAEP_PADDING,
oaepHash: "sha256",
},
Buffer.from(result[i].pw, "base64")
);
});
我在检查其他问题的路上碰巧看到了这个问题。写这个意见只是为了帮助你的问题。
当我看到你的错误信息时,我认为padding
可能有问题。
所以我检查了你的padding: crypto.constants.RSA_PKCS1_OAEP_PADDING
代码,并注意到crypto
变量在你导入它时从未声明过,而你只从crypto
声明了generateKeyPairSync
,就像这样,
const { generateKeyPairSync } = require('crypto');
在Node.js文档的crypto
部分之后,他们在导入时在代码的顶部声明了crypto
变量。
const crypto = require('crypto');
希望这对你的问题有帮助。