从哈希字符串中获取原始密码
Get original password from a hash string
在 C# 代码中,我有一个使用 WinSCP API 的应用程序。 (是否是 WinSCP 或其他什么并不重要)。
要打开一个会话,我需要一个用户和密码;由于 user/password 没有被任何外部用户引入,它直接从 app.config 之类的配置文件中获取并直接通过代码插入,我需要一种方法将其安全地存储在配置文件中。
我已使用此哈希生成器:http://www.danstools.com/md5-hash-generator/ 从我的密码字符串生成 MD5 哈希字符串,并将其存储在 app.config 文件中。
所以我的问题是:如何从 "hash" 字符串中获取原始密码?
以防万一:
如果这不是实现我需要的正确方法,请告诉我安全存储密码的好方法,并在需要时取回原始密码以在代码中使用它。
谢谢。
使用散列来存储密码的原因是无法检索原始密码。通过这种方式可以安全地存储密码。
进行身份验证的方法是对密码使用相同的哈希函数(在您的情况下为 MD5),并比较两个哈希值是否相等,而不是比较密码本身。
哈希函数只在一个方向上起作用,但它会为相同的输入产生相同的结果。
希望对您有所帮助!
好吧,直截了当地说,你的方案被破坏了,你完全误解了哈希函数。
哈希函数是一种方法。您不应该能够反转它们 - 事实上,有时两个不同的字符串会具有相同的哈希值。例如,
4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2
4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2
两个 Md5() 到:008ee33a9d58b51cfeb425b0959121c9
(source)
根本无法 "reverse" 他们,因为那是 "message digest".
的重点
不要使用某些网站来生成密码的哈希值,这很冒险。您在未加密的连接 (http) 上输入了您的超级安全密码,并将其提供给可能会或可能不会存储它的第三方站点(连同您的 IP)。这听起来很偏执,但如果你试图保护这个密码,那么你就会在这个过程中犯很多错误。我认为该密码不能再使用了。
MD5 不是acceptable 密码哈希算法。它太快了,如果我得到你密码的散列值,我可能可以在不到一天的时间内破解它,甚至可能更快。那就是如果你使用的是盐,而你可能没有使用。在那种情况下,您的密码将在几秒钟内被破解并出现彩虹table。你想要像 bcrypt/scrypt/pbkdf2 这样的东西,因为它们有一个可配置的工作因素,这会使它们变慢。
您的 app.config 应该是一个相当安全的文件,有些文件会很舒服 table 在此处以明文形式存储 passwords/connection 字符串。您想保护它很好,但正确的方法是 加密 配置文件(或只是特定字段)。加密 => 可逆:散列 => 不可逆。
关于如何加密配置文件已经有很多问题,描述如何加密超出了问题的范围。
在此处查看(以及链接的副本):Encrypting Web.Config
在 C# 代码中,我有一个使用 WinSCP API 的应用程序。 (是否是 WinSCP 或其他什么并不重要)。
要打开一个会话,我需要一个用户和密码;由于 user/password 没有被任何外部用户引入,它直接从 app.config 之类的配置文件中获取并直接通过代码插入,我需要一种方法将其安全地存储在配置文件中。
我已使用此哈希生成器:http://www.danstools.com/md5-hash-generator/ 从我的密码字符串生成 MD5 哈希字符串,并将其存储在 app.config 文件中。
所以我的问题是:如何从 "hash" 字符串中获取原始密码?
以防万一:
如果这不是实现我需要的正确方法,请告诉我安全存储密码的好方法,并在需要时取回原始密码以在代码中使用它。
谢谢。
使用散列来存储密码的原因是无法检索原始密码。通过这种方式可以安全地存储密码。 进行身份验证的方法是对密码使用相同的哈希函数(在您的情况下为 MD5),并比较两个哈希值是否相等,而不是比较密码本身。 哈希函数只在一个方向上起作用,但它会为相同的输入产生相同的结果。
希望对您有所帮助!
好吧,直截了当地说,你的方案被破坏了,你完全误解了哈希函数。
哈希函数是一种方法。您不应该能够反转它们 - 事实上,有时两个不同的字符串会具有相同的哈希值。例如,
4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa200a8284bf36e8e4b55b35f427593d849676da0d1555d8360fb5f07fea2
4dc968ff0ee35c209572d4777b721587d36fa7b21bdc56b74a3dc0783e7b9518afbfa202a8284bf36e8e4b55b35f427593d849676da0d1d55d8360fb5f07fea2
两个 Md5() 到:008ee33a9d58b51cfeb425b0959121c9
(source)
根本无法 "reverse" 他们,因为那是 "message digest".
的重点不要使用某些网站来生成密码的哈希值,这很冒险。您在未加密的连接 (http) 上输入了您的超级安全密码,并将其提供给可能会或可能不会存储它的第三方站点(连同您的 IP)。这听起来很偏执,但如果你试图保护这个密码,那么你就会在这个过程中犯很多错误。我认为该密码不能再使用了。
MD5 不是acceptable 密码哈希算法。它太快了,如果我得到你密码的散列值,我可能可以在不到一天的时间内破解它,甚至可能更快。那就是如果你使用的是盐,而你可能没有使用。在那种情况下,您的密码将在几秒钟内被破解并出现彩虹table。你想要像 bcrypt/scrypt/pbkdf2 这样的东西,因为它们有一个可配置的工作因素,这会使它们变慢。
您的 app.config 应该是一个相当安全的文件,有些文件会很舒服 table 在此处以明文形式存储 passwords/connection 字符串。您想保护它很好,但正确的方法是 加密 配置文件(或只是特定字段)。加密 => 可逆:散列 => 不可逆。
关于如何加密配置文件已经有很多问题,描述如何加密超出了问题的范围。
在此处查看(以及链接的副本):Encrypting Web.Config