我在应用程序中考虑解密密码的问题。 例如: 我用密钥加密密码(保存在应用程序中)并将加密保存到数据库。 如果我登录到应用程序,我从数据库加载加密,并使用相同的密钥解密为密码,并与写入textboxt的用户密码相同。
这是好方法吗? 我认为这是不好的方式,因为如果有人丢失了源代码,那么所有密码都是危险的。是否更好地使用Identity for .NET或编写自己的解决方案?
感谢您的回答:)
答案 0 :(得分:2)
要以正确的方式存储密码,您需要做三件事:
仅存储用户密码哈希值
为什么:现在你不知道密码,也没有简单的方法可以找到密码。如果你不能,攻击者也会遇到更多麻烦。
显然你想选择一个不被认为是破坏的哈希算法。
每个用户使用一个长的随机盐,每次更改密码都可以更改盐
盐可以防止使用使用众所周知密码的预先计算哈希的攻击技术(如“密码”,“letmein”等)。这对于做正确至关重要。选择长盐并随机选择它们。您可以将盐与哈希一起存储,这不是问题。
使用SLOW哈希。
这是很多人推出自己的解决方案。最着名的哈希算法设计得很快。如果您使用快速算法,使用GPU场的攻击者仍然可以破解用户通常使用字典攻击选择的大约95%的密码。
所以你需要选择一个尽可能慢的算法。使用一轮SHA-1,SHA-2甚至SHA-3并不足以成为真正的挑战。
然后是规则0: 切勿透露自己的CRYPTO
原因是你不会从知识渊博的人那里得到同行评审。你真的希望审查发生,因为错误很容易造成,并产生可怕的后果。
因此 - 使用图书馆和 - 正确使用它:选择一个用于存储密码的缓慢哈希值,并设置参数以使其尽可能慢。
验证用户输入的密码:
答案 1 :(得分:1)
这是一个坏主意。只存储密码和散列版本的密码。 不存储加密版本的密码。
正确的过程是存储密码和哈希版本的密码。当用户尝试登录时,检索他们输入的用户名的salt,并使用它来加密和散列用户输入的密码。将其与数据库中的salted和hashed版本进行比较。
绝对使用图书馆。 从不滚动您自己的密码哈希码。这是您在新闻中听到的主要密码泄漏的数量(如果不是大多数)。
答案 2 :(得分:0)
是的,这很糟糕。最好的方法是使用一些具有一些加密算法的库。通过这种方式,你确信你做得很好。