C# 从哈希字符串获取原始密码

C# 从哈希字符串获取原始密码,c#,security,hash,passwords,app-config,C#,Security,Hash,Passwords,App Config,在C代码中,我有一个使用WinSCPAPI的应用程序。(如果是WinSCP或其他什么并不重要) 要打开会话,我需要一个用户和密码;由于该用户/密码不是由任何外部用户引入的,它直接从app.config之类的配置文件中获取,并通过代码直接插入,因此我需要一种方法将其安全地存储在配置文件中 我使用了这个哈希生成器:从我的密码字符串生成一个MD5哈希字符串,它存储在app.config文件中 所以我的问题是:如何从“哈希”字符串中获取原始密码 以防万一: 如果这不是实现我所需的正确方法,请告诉我安全存

在C代码中,我有一个使用WinSCPAPI的应用程序。(如果是WinSCP或其他什么并不重要)

要打开会话,我需要一个用户和密码;由于该用户/密码不是由任何外部用户引入的,它直接从app.config之类的配置文件中获取,并通过代码直接插入,因此我需要一种方法将其安全地存储在配置文件中

我使用了这个哈希生成器:从我的密码字符串生成一个MD5哈希字符串,它存储在app.config文件中

所以我的问题是:如何从“哈希”字符串中获取原始密码

以防万一:

如果这不是实现我所需的正确方法,请告诉我安全存储密码的好方法,并在需要时返回原始密码以在代码中使用它


谢谢。

使用哈希存储密码的原因是无法检索原始密码。这样可以安全地存储密码。 身份验证的方法是对密码使用相同的hashfunction(在您的例子中是MD5),并比较两个哈希值是否相等,而不是密码本身。 hashfunction只在一个方向上工作,但它将为相同的输入重现相同的结果


我希望这有帮助

使用哈希存储密码的原因是无法检索原始密码。这样可以安全地存储密码。 身份验证的方法是对密码使用相同的hashfunction(在您的例子中是MD5),并比较两个哈希值是否相等,而不是密码本身。 hashfunction只在一个方向上工作,但它将为相同的输入重现相同的结果


我希望这有帮助

好的,坦率地说,你的方案被破坏了,你完全误解了散列函数

散列函数是一种方法。您不应该能够反转它们-事实上,有时两个不同的字符串将具有相同的哈希。比如说,

4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2
4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2
Md5()到:
008ee33a9d58b51cfeb425b0959121c9
()

根本没有办法“逆转”它们,因为这是“消息摘要”的要点

不要使用某些网站来生成密码哈希,这只是有风险的。您在未加密的连接(http)上键入了超级安全密码,并将其提供给第三方站点,该站点可能会存储该密码,也可能不会存储该密码(以及您的IP)。这听起来有点偏执,但是如果你试图保护这个密码,那么你会犯很多错误。在我看来,那个密码已经不能用了

MD5不是可接受的密码哈希算法。它太快了,如果我得到你的密码,我可能能在不到一天内破解它,甚至可能更快。如果你用的是一种盐,你可能不会。在这种情况下,您的密码将在几秒钟内被破解彩虹表。您需要像bcrypt/scrypt/pbkdf2这样的东西,因为它们有一个可配置的工作因子,这会使它们变慢

你的app.config应该是一个相当安全的文件,有些人可以在这里以明文形式存储密码/连接字符串。您希望保护这一点很好,但正确的方法是对配置文件(或特定字段)进行加密。加密=>可逆:哈希=>不可逆

关于如何加密配置文件,已经有很多问题,描述如何加密已经超出了问题的范围


检查这里(以及链接的副本):

好的,坦率地说,您的方案被破坏了,您完全误解了哈希函数

散列函数是一种方法。您不应该能够反转它们-事实上,有时两个不同的字符串将具有相同的哈希。比如说,

4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2
4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2
Md5()到:
008ee33a9d58b51cfeb425b0959121c9
()

根本没有办法“逆转”它们,因为这是“消息摘要”的要点

不要使用某些网站来生成密码哈希,这只是有风险的。您在未加密的连接(http)上键入了超级安全密码,并将其提供给第三方站点,该站点可能会存储该密码,也可能不会存储该密码(以及您的IP)。这听起来有点偏执,但是如果你试图保护这个密码,那么你会犯很多错误。在我看来,那个密码已经不能用了

MD5不是可接受的密码哈希算法。它太快了,如果我得到你的密码,我可能能在不到一天内破解它,甚至可能更快。如果你用的是一种盐,你可能不会。在这种情况下,您的密码将在几秒钟内被破解彩虹表。您需要像bcrypt/scrypt/pbkdf2这样的东西,因为它们有一个可配置的工作因子,这会使它们变慢

你的app.config应该是一个相当安全的文件,有些人可以在这里以明文形式存储密码/连接字符串。您希望保护这一点很好,但正确的方法是对配置文件(或特定字段)进行加密。加密=>可逆:哈希=>不可逆

关于如何加密配置文件,已经有很多问题,描述如何加密已经超出了问题的范围


检查此处(以及链接的副本):

谢谢。我没有使用散列密码与其他密码进行比较,而是使用它安全地存储密码并使用它登录到API会话。所以我需要一种方法来取回我的密码…是的,我的答案是,这是不可能的。哈希是专门设计用来禁止解密的。您需要的是加密/解密,而散列不是实现这一点的方法。很抱歉没有回答你问题的第二部分。谢谢。我没有使用散列密码将其与其他密码进行比较