加密数据以便以后解密

时间:2019-06-26 15:21:18

标签: javascript node.js encryption stripe-payments

我正在创建一种方法来计算使用Stripe升级订阅软件包的价格。 Stripe具有内置功能,并会在发出请求时计算出按比例​​分配的价格,即“ proration_date”值。

如果客户同意该价格,则假设我在下一个请求中同时传递了“ proration_date”,则用户可以按照显示的价格购买该价格。

所有这些请求都是在后端服务器上完成的,由于限制,“ proration_date”无法存储在数据库中,这意味着我需要将其提供给客户端。

要解决此问题,我想将加密令牌传递给将保存proration_date的客户端。然后,在付款请求中,我将使用加密的令牌并在服务器上对其进行解密。

我已经尝试并测试了以下代码 here,它似乎可以正常工作。代码的基础也已显示。

这是足够安全的加密方法吗?

function encrypt(text) {
 let iv = crypto.randomBytes(IV_LENGTH);
 let cipher = crypto.createCipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
 let encrypted = cipher.update(text);

 encrypted = Buffer.concat([encrypted, cipher.final()]);

 return iv.toString('hex') + ':' + encrypted.toString('hex');
}

function decrypt(text) {
 let textParts = text.split(':');
 let iv = Buffer.from(textParts.shift(), 'hex');
 let encryptedText = Buffer.from(textParts.join(':'), 'hex');
 let decipher = crypto.createDecipheriv('aes-256-cbc', Buffer.from(ENCRYPTION_KEY), iv);
 let decrypted = decipher.update(encryptedText);

 decrypted = Buffer.concat([decrypted, decipher.final()]);

 return decrypted.toString();
}

1 个答案:

答案 0 :(得分:0)

您正在按预期使用加密模块。但是,有几种简便的方法可以在CBC模式下破解AES,例如,参见http://cryptopals.com/sets/2/challenges/16http://cryptopals.com/sets/3/challenges/17。前者的攻击通过密文更改了纯文本,而后者则演示了如何在没有密钥的情况下解密密文。

教训是,机密性只是密码学的一个方面。您还需要数据完整性。也就是说,您要检测传入的客户端数据是否已被篡改。

我可以建议您看一下本讲座,以了解消息认证代码(MAC):https://www.youtube.com/watch?v=DiLPn_ldAAQ。讲师Christof Paar的教科书也很方便。