我正在创建一种方法来计算使用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();
}
答案 0 :(得分:0)
您正在按预期使用加密模块。但是,有几种简便的方法可以在CBC模式下破解AES,例如,参见http://cryptopals.com/sets/2/challenges/16或http://cryptopals.com/sets/3/challenges/17。前者的攻击通过密文更改了纯文本,而后者则演示了如何在没有密钥的情况下解密密文。
教训是,机密性只是密码学的一个方面。您还需要数据完整性。也就是说,您要检测传入的客户端数据是否已被篡改。
我可以建议您看一下本讲座,以了解消息认证代码(MAC):https://www.youtube.com/watch?v=DiLPn_ldAAQ。讲师Christof Paar的教科书也很方便。