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

时间:2015-09-23 13:51:30

标签: c# security hash passwords app-config

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

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

我已经使用这个哈希生成器:http://www.danstools.com/md5-hash-generator/从我的密码字符串生成MD5哈希字符串,它存储在app.config文件中。

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

以防万一:

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

谢谢。

2 个答案:

答案 0 :(得分:4)

好吧,说实话,你的方案已经破解,你完全误解了哈希函数。

哈希函数是一种方法。你不应该能够反转它们 - 实际上,有时两个不同的字符串将具有相同的哈希值。例如,

4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2
4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2

Md5()至:008ee33a9d58b51cfeb425b0959121c9source

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

请勿使用某些网站生成密码哈希值,这样做风险很大。您在未加密的连接(http)上键入了超级安全密码,并将其提供给可能存储或不存储的第三方网站(以及您的IP)。这听起来很偏执,但是如果你想保护这个密码,那么你在这个过程中会犯很多错误。在我看来,该密码不再可用。

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

你的app.config应该是一个相当安全的文件,有些人愿意在这里以明文存储密码/连接字符串。你想要保护它是好的,但正确的方法是加密配置文件(或只是特定的字段)。加密=>可逆的:散列=>不可逆的。

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

点击此处(以及链接的重复项):Encrypting Web.Config

答案 1 :(得分:1)

使用哈希来存储密码的原因是无法检索原始密码。这样就可以安全地存储密码。 验证的方法是在密码上使用相同的哈希函数(在您的情况下为MD5),并比较两个哈希值是否相等而不是密码本身。 散列函数仅在一个方向上起作用,但它将为同一输入重现相同的结果。

我希望这有帮助!