我想使用AES256加密令牌创建和管理用户会话。
我正在使用节点的加密库并遵循此stackoverflow question。
我正在使用它来创建会话令牌,该会话令牌将被发送到前端并存储在后端以进行验证,并且数据是字符串化的JSON。
我在这里看到两件事,一件是password
,另一件是iv
。
所以有两个问题,
iv是否可以安全地发送到前端(iv + "." + encData)
?
如何生成密码? SHA256怎么样(例如我在注册时存储在db中的用户密码)
这样我将为每个用户使用不同的密码。这种方法是否正确?
P.S。以下两个答案都有很大帮助,如果你在这里,请阅读所有评论并附上所以问题和链接的文章。
答案 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)
让我们继续讨论手头的问题:
- iv是否可以安全地发送到前端(iv +“。”+ encData)?
醇>
嗯,是的。 IV可能是公共知识;只要它是唯一的 - 在CBC模式加密的情况下 - 随机然后这是好的。当然,IV和encData应该进行适当的编码,例如使用十六进制(如在链接的答案中)或base 64.这通常不会完成,因为对于AES,IV总是16字节,所以很容易简单地加上前缀改为使用二进制IV到encData。
谨防黑客改变输入;如果删除了点或冒号,那么你可能只有一个元素的数组,访问密文可能会导致错误或空数据的解密。
- 如何生成密码? SHA256怎么样(例如我在注册时存储在db中的用户密码)
醇>
不,你应该使用密码哈希; SHA-256是加密安全散列,但不是密码散列,如PBKDF2,bcrypt,scrypt或Argon2。如果你想在数据库中存储一些东西,那么请不要让它成为密码生成的AES密钥。
这绝不会使answer of TheGreatContini中的任何问题无效。这不是安全建议,只是您要求的与加密相关的建议。