在应用程序中解密密码是好方法吗?

时间:2015-07-04 18:02:56

标签: .net security encryption password-encryption

我在应用程序中考虑解密密码的问题。 例如: 我用密钥加密密码(保存在应用程序中)并将加密保存到数据库。 如果我登录到应用程序,我从数据库加载加密,并使用相同的密钥解密为密码,并与写入textboxt的用户密码相同。

这是好方法吗? 我认为这是不好的方式,因为如果有人丢失了源代码,那么所有密码都是危险的。是否更好地使用Identity for .NET或编写自己的解决方案?

感谢您的回答:)

3 个答案:

答案 0 :(得分:2)

要以正确的方式存储密码,您需要做三件事:

  1. 仅存储用户密码哈希值

    为什么:现在你不知道密码,也没有简单的方法可以找到密码。如果你不能,攻击者也会遇到更多麻烦。

    显然你想选择一个不被认为是破坏的哈希算法。

  2. 每个用户使用一个长的随机盐,每次更改密码都可以更改盐

    盐可以防止使用使用众所周知密码的预先计算哈希的攻击技术(如“密码”,“letmein”等)。这对于做正确至关重要。选择长盐并随机选择它们。您可以将盐与哈希一起存储,这不是问题。

  3. 使用SLOW哈希。

    这是很多人推出自己的解决方案。最着名的哈希算法设计得很快。如果您使用快速算法,使用GPU场的攻击者仍然可以破解用户通常使用字典攻击选择的大约95%的密码。

    所以你需要选择一个尽可能慢的算法。使用一轮SHA-1,SHA-2甚至SHA-3并不足以成为真正的挑战。

  4. 然后是规则0: 切勿透露自己的CRYPTO

    原因是你不会从知识渊博的人那里得到同行评审。你真的希望审查发生,因为错误很容易造成,并产生可怕的后果。

    因此 - 使用图书馆和 - 正确使用它:选择一个用于存储密码的缓慢哈希值,并设置参数以使其尽可能慢。

    验证用户输入的密码:

    • 您从用户那里获得明文密码
    • 从数据库中检索salt和存储的哈希
    • 你计算salt + plaintext的哈希值
    • 将它与从数据库中检索的哈希进行比较:
      • 如果匹配:密码正常,
      • 如果不匹配,则密码错误。

答案 1 :(得分:1)

这是一个坏主意。只存储密码和散列版本的密码。 存储加密版本的密码。

正确的过程是存储密码和哈希版本的密码。当用户尝试登录时,检索他们输入的用户名的salt,并使用它来加密和散列用户输入的密码。将其与数据库中的salted和hashed版本进行比较。

绝对使用图书馆。 从不滚动您自己的密码哈希码。这是您在新闻中听到的主要密码泄漏的数量(如果不是大多数)。

答案 2 :(得分:0)

是的,这很糟糕。最好的方法是使用一些具有一些加密算法的库。通过这种方式,你确信你做得很好。