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

Is good way decrypt password in application?

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

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

感谢您的回答:)

这是个坏主意。只存储加盐和哈希版本的密码。 不要存储密码的加密版本。

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

并且一定要使用图书馆。 从不 滚动您自己的密码散列代码。这就是您在新闻中听到的主要密码泄露事件的发生次数(如果不是大多数的话)。

是的,这很糟糕。最好的方法是使用一些具有某种加密算法的库。这样你就确定你做得好。

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

  1. 仅存储散列的用户密码

    原因:现在您不知道密码,也没有简单的方法可以找到它。如果你做不到,你的攻击者也会有更多的麻烦。

    显然,您想选择一种本身不会被视为损坏的哈希算法。

  2. 每个用户使用长随机盐,您甚至可以在每次更改密码时更改盐

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

  3. 使用慢散列。

    这是许多自行解决方案的人所错过的一个。最著名的散列算法被设计成快速的。如果您使用快速算法,使用 GPU 农场的攻击者仍然可以破解大约 95% 的用户通常使用字典攻击选择的密码。

    所以你需要选择一个你能忍受的最慢的算法。使用一轮 SHA-1、SHA-2 甚至 SHA-3 都不足以成为真正的挑战。

然后是规则 0: 永远不要发明自己的加密货币

原因是你不会得到知识渊博的人的同行评审。您真的希望进行审查,因为错误很容易犯,并且会产生可怕的后果。

因此 - 使用图书馆和 - 正确使用它:选择一个专为存储密码而设计的慢散列,并设置参数使其尽可能慢。

验证用户输入的密码:

  • 你从用户那里得到了明文密码,
  • 您从数据库中检索盐和存储的散列
  • 你计算盐+明文的散列
  • 您将它与从数据库中检索到的散列进行比较:
    • 如果匹配:密码正确,
    • 如果不匹配,则密码错误。