AES256密码和iv,正确的方法

时间:2017-09-20 19:14:05

标签: node.js cryptography cryptojs

我想使用AES256加密令牌创建和管理用户会话。

我正在使用节点的加密库并遵循此stackoverflow question

我正在使用它来创建会话令牌,该会话令牌将被发送到前端并存储在后端以进行验证,并且数据是字符串化的JSON。

我在这里看到两件事,一件是password,另一件是iv

所以有两个问题,

  1. iv是否可以安全地发送到前端(iv + "." + encData)

  2. 如何生成密码? SHA256怎么样(例如我在注册时存储在db中的用户密码)

  3. 这样我将为每个用户使用不同的密码。这种方法是否正确?

    P.S。以下两个答案都有很大帮助,如果你在这里,请阅读所有评论并附上所以问题和链接的文章。

2 个答案:

答案 0 :(得分:2)

您可能想要 AES加密,但加密不是您需要的!为了您的应用程序的安全性,消息完整性比加密更重要。

加密通常不提供消息完整性(请参阅Top 10 Developer Crypto Mistakes的第7节),除非您专门使用提供它的操作模式(例如GCM模式)。因此,您设计的解决方案本身就是错误的。更多信息见下文脚注(!)。

了解您的需求 - 消息完整性+加密或仅消息完整性。如果仅是消息完整性,则使用HMAC。

您需要了解的另一件事是AES和HMAC等功能不使用密码,而是使用加密密钥。请参阅Top 10 Developer Crypto Mistakes的第6部分。

目前尚不清楚你的问题是关于IV问题,鉴于你的方法是错误的,但无论如何要回答它,IV不需要保密。请参阅前10个开发人员加密错误的第2部分。

我通常同意上面的评论:使用JWT的方式,而不是尝试构建自己的解决方案。 JWT有expiration保留的声明,因此没有理由不这样做。

脚注(!):如果您想了解消息完整性和加密之间的混淆是如何被滥用的,您可以尝试Pentester Labs的this exercise(不幸的是它需要订阅,但它很便宜)。当然这是针对ECB模式的,类似的概念可以用于CBC模式。

答案 1 :(得分:2)

让我们继续讨论手头的问题:

  
      
  1. iv是否可以安全地发送到前端(iv +“。”+ encData)?
  2.   

嗯,是的。 IV可能是公共知识;只要它是唯一的 - 在CBC模式加密的情况下 - 随机然后这是好的。当然,IV和encData应该进行适当的编码,例如使用十六进制(如在链接的答案中)或base 64.这通常不会完成,因为对于AES,IV总是16字节,所以很容易简单地加上前缀改为使用二进制IV到encData。

谨防黑客改变输入;如果删除了点或冒号,那么你可能只有一个元素的数组,访问密文可能会导致错误或空数据的解密。

  
      
  1. 如何生成密码? SHA256怎么样(例如我在注册时存储在db中的用户密码)
  2.   

不,你应该使用密码哈希; SHA-256是加密安全散列,但不是密码散列,如PBKDF2,bcrypt,scrypt或Argon2。如果你想在数据库中存储一些东西,那么请不要让它成为密码生成的AES密钥。

这绝不会使answer of TheGreatContini中的任何问题无效。这不是安全建议,只是您要求的与加密相关的建议。