gpt4 book ai didi

javascript - 为什么我的 cipher.final 因 key 不正确而失败?

转载 作者:行者123 更新时间:2023-12-02 18:32:58 28 4
gpt4 key购买 nike

问题和应用程序BG:所以我正在创建一个存储一些敏感数据的nodeJS应用程序,并且我想加密所有内容。但是,当我尝试使用错误的 key 解密某些数据时,我收到 TypeError: DecipherFinal failed 错误。

以下是我的应用程序安全性的工作原理:(请注意,这是针对 AppJS 而不是面向 Web 的应用程序)

  1. 用户可以“创建帐户”,这会创建一个新文件;文件的第一行用作标识符: encrypt("Somestring"+ username)

  2. 用户可以登录,这将打开文件并使用其密码解密第一行。如果它恰好是“Somestring”+用户名,那么我们就让用户登录。

只要我不使用错误的 key (这会导致 DecipherFinal 失败错误),此操作就可以正常工作。

问题:

  1. 是否有可能做我想做的事情?我假设如果我使用不正确的 key 通过解密函数运行数据,我只会得到不正确的数据。

  2. 这是一个糟糕的设计吗?我在某处读到,不应将哈​​希密码与使用该密码加密的数据存储在同一数据库中,因此我认为用户可以跟踪它,而不是存储密码,并且他们可以解密预期的消息用于授权。数据的性质使得其他人无法获取数据非常重要,但用户可以恢复其数据则不是很重要。

  3. 这是“滚动我自己的加密货币”吗?这是否意味着坚持已知的模式或只是坚持经过验证的原语和算法?如果这是我自己的,是否有任何可以用于 Node 的加密容器的实现?

代码:

https://gist.github.com/sanarothe/5993384

非常感谢,

卡梅伦

最佳答案

至于解密失败的原因,AES256的 block 大小为16字节(即它只能加密16字节 block 中的数据)由于您的数据不一定是能被16整除的大小,因此加密库有autopadding打开添加一些填充数据(本例中为 PKCS)以使长度可被 16 整除。

填充的构造是为了当解密到达数据末尾时,它确切地知道要删除哪些字节以在正确的字节处 chop 消息,并且不会在末尾返回垃圾。问题在于,当它以随机数据结束时,“unpadding”检测到它无法找到结束标记并解密失败。请注意,完全随机的数据实际上可能包含有效的标记,因此您无法以任何方式保证此检查即使在随机数据上也会失败。

如果您确实不希望解密因填充不匹配而失败,您可以确保数据的长度可被 16 整除(通过以您喜欢的任何方式自行填充)并在调用 cipher.setautopadding(false) 之前使用 final 关闭自动填充加密和解密。这样,您就不会遇到解密失败,并且在您尝试时必须自己检测加密失败。

至于设计,对我来说整个方案听起来有点像滚动你自己的安全性。例如,如果您添加可以检查有效性的数据(就像处理第一行已知数据一样),那么您就可以通过允许攻击者在已知位置使用(或多或少)已知的纯文本来帮助他们在流中测试 key 。目前,AES256 对于已知的纯文本攻击相当安全,但几年后你永远不会知道。

第二件事,您需要使用 AES-256-CBC 或类似的,我不确定加密模块默认使用什么 mode of operation

关于javascript - 为什么我的 cipher.final 因 key 不正确而失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17637108/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com