在C#代码中,我有一个使用WinSCP API的应用程序。 (如果是WinSCP或其他什么并不重要。)
要打开会话,我需要一个用户和一个密码;由于任何外部用户都没有引入该用户/密码,因此它直接从app.config等配置文件中获取并直接通过代码插入,我需要一种方法将其安全地存储在配置文件中。
我已经使用这个哈希生成器:http://www.danstools.com/md5-hash-generator/从我的密码字符串生成MD5哈希字符串,它存储在app.config文件中。
所以我的问题是:如何从“哈希”字符串中获取原始密码?
以防万一:
如果不是实施我需要的正确方法,请告诉我安全存储密码的好方法,并在需要时,取回原始密码以在代码中使用它。
谢谢。
答案 0 :(得分:4)
好吧,说实话,你的方案已经破解,你完全误解了哈希函数。
哈希函数是一种方法。你不应该能够反转它们 - 实际上,有时两个不同的字符串将具有相同的哈希值。例如,
4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2
4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2
Md5()至:008ee33a9d58b51cfeb425b0959121c9
(source)
没有办法“逆转”它们,因为这是“消息摘要”的重点。
请勿使用某些网站生成密码哈希值,这样做风险很大。您在未加密的连接(http)上键入了超级安全密码,并将其提供给可能存储或不存储的第三方网站(以及您的IP)。这听起来很偏执,但是如果你想保护这个密码,那么你在这个过程中会犯很多错误。在我看来,该密码不再可用。
MD5不是可接受的密码哈希算法。它太快了,如果我得到你的密码哈希,我可能能够在不到一天的时间内破解它,甚至可能更快。那就是如果你使用盐,你可能不是。在这种情况下,您的密码将在几秒钟内被彩虹表破解。你想要像bcrypt / scrypt / pbkdf2这样的东西,因为它们有一个可配置的工作因子,使它们变慢。
你的app.config应该是一个相当安全的文件,有些人愿意在这里以明文存储密码/连接字符串。你想要保护它是好的,但正确的方法是加密配置文件(或只是特定的字段)。加密=>可逆的:散列=>不可逆的。
关于如何加密配置文件已经有很多问题,描述如何解决问题超出了范围。
点击此处(以及链接的重复项):Encrypting Web.Config
答案 1 :(得分:1)
使用哈希来存储密码的原因是无法检索原始密码。这样就可以安全地存储密码。 验证的方法是在密码上使用相同的哈希函数(在您的情况下为MD5),并比较两个哈希值是否相等而不是密码本身。 散列函数仅在一个方向上起作用,但它将为同一输入重现相同的结果。
我希望这有帮助!