我正试图加密有效载荷和保护快速弹簧事务的密钥。
我跟踪他们的文档https://community.fastspring.com/s/article/Passing-Sensitive-Data-with-Secure-Requests
这是我的数据加密代码
async function encrypt(payload) {
const aesKey = crypto.randomBytes(16);
const iv = new Buffer("");
const cipher = crypto.createCipheriv('aes-128-ecb', aesKey, iv);
var encryptedPayload = cipher.update(new Buffer(JSON.stringify(payload), 'utf8'), 'utf8', 'base64');
const securePayload = encryptedPayload + cipher.final('base64');
const secureKey = crypto.privateEncrypt('MIIEpQIBA.....', iv).toString('base64');
return {
securePayload: securePayload,
secureKey: secureKey
};
};当我试图用有效载荷调用函数时
{
"contact": {
"email": "xxxxxx",
"firstName": "xxxxxx",
"lastName": "zxxxx"
},
"items": "cart"
}我有错误
TypeError:不能读取null (读取'2')在t.exports (worker.js:14:163836)在u (worker.js:8:103816)在t.exports as publicEncrypt at e.privateEncrypt (worker.js:14:210199)在worker.js:10:297620 at worker.js:10:300887
问题是在privateEncrpyt函数中,我直接将私钥作为字符串传递。如果有人知道如何解决这个问题,或者给我更多的指导,我会很感激。
我使用cloudflare员工来构建这个。
谢谢
发布于 2022-08-04 21:39:26
如果您使用FastSpring文档中给出的用于生成RSA私钥的指令:
openssl genrsa -out privatekey.pem 2048生成的密钥是PKCS#1格式的PEM编码的私有RSA密钥。这可以在privateEncrypt()的第一个参数中导入,如下所示:
var pkcs1pem = `-----BEGIN RSA PRIVATE KEY-----
MII...
-----END RSA PRIVATE KEY-----`;
...
const secureKey = crypto.privateEncrypt(pkcs1pem, aesKey).toString('base64');为了完整起见:密码支持PKCS#1格式之外的私密RSA密钥,也支持PKCS#8格式,除了PEM编码之外,还支持DER编码。
关于FastSpring加密方法的说明:
使用privateEncrypt()和FastSpring指定的私钥加密AES密钥实际上是错误的方法。privateEncrypt()用于创建签名(作为低级别签名过程的一部分)。签名的目的不是为了保密数据,而是为了验证数字消息的真实性。从签名(至少在这里创建时),原始数据,即AES密钥,可以很容易地使用公钥进行重构。由于一般情况下,任何人都可以拥有公钥,因此AES密钥就被破坏了。
FastSpring方法的基本问题是实际的公钥必须保密,引用FastSpring:创建一个2048位的RSA公钥。只与FastSpring共享此密钥。然而,公开钥匙的保密在实践中没有得到保障(除了它与公钥的概念相矛盾这一事实之外)。例如,公钥可能在传输到FastSpring期间被截获,或者可能被FastSpring本身意外泄漏,等等。
正确的方法是用publicEncrypt()和FastSpring的公钥对AES密钥进行加密。然后保证只有FastSpring才能解密加密的AES密钥,因为只有FastSpring才有私钥。
https://stackoverflow.com/questions/73234642
复制相似问题