因此,从我所看到的,如果没有强制它或使用彩虹表,就不可能解密任何哈希算法,如MD5或SHA-1。这似乎让我在使用哈希的几个方面感到困惑。这些令人困惑的地方是:
如果无法解密,首先要散列的是什么?
如何在数据库中使用散列密码?
此外,由于人们说它就像模运算一样,如果有什么东西阻止多个输入等同于同一个哈希?
答案 0 :(得分:1)
如果某人只是在密码上使用SHA1或MD5,那么他们几乎得不到保护。
这就是理解处理“密码哈希”的正确方法的重要性。请阅读Our password hashing has no clothes
回答你的问题:
您可以在没有“解密哈希”的情况下验证用户:您只需在登录时“哈希”用户输入的密码(连同盐和其他参数)并验证它是否与存储在数据库中。
参见1和Troy Hunt链接
那些认为它就像模数操作的人正在做一个不好的比喻:他们是这方面的非专家。无论如何,“哈希”函数的属性使得很难找到冲突,并且盐会阻止具有相同密码的两个用户在数据库中使用相同的密码“哈希”。
其他资源:
答案 1 :(得分:0)
它不像模数。根据输入,合理地保证散列是唯一的。如果您在数据库中输入密码作为哈希值,那么您需要做的就是对密码条目进行哈希处理,并根据您在数据库中存储的内容进行检查。这样,您就不会在数据库中存储可读密码,这些密码对其他人公开可见。通常情况下,你会有一个私钥,一些盐和一些独特的东西,比如哈希算法中包含的时间戳,以确保它不会被轻易欺骗。
这可以帮助您进一步: http://searchsqlserver.techtarget.com/definition/hashing
答案 2 :(得分:0)
即使散列过程基本上是不可解密的,前面提到的问题是每个散列几乎都是唯一的,这意味着使用包含许多不同单词及其加密散列的md5decrypt等网站,可以找到他正在寻找的密码。
如果密码首先不够强大的话。显然,不应该使用密码“password”,因为它可能会在大多数网站中找到,例如md5decrypt。
保护网站密码的措施实际上很简单。首先,不要使用像md5或sha1这样的旧哈希。至少使用sha256,如果你有足够的sql存储,sha384或sha512。您应该知道大多数在线哈希数据库只是最常用的哈希值(在大多数情况下,比如md5,sha1,sha256)。所以你应该找到一个在在线数据库中没有很好表示的哈希类型。
然后你应该(你实际上)在加密用户密码时使用salt,即在加密密码之前添加一些单词,字母等等,然后将那些盐存储在某处,这样你仍然可以让人们记录你也可以在盐中添加一个pepper来强化一切。
在使用盐时,尝试找到黑客不会想到的方法,例如加倍盐,或三倍,或尝试不同的方法来连接盐和实际密码等。你也可以制作双盐加密,如sha512(sha384()),几乎不可能找到。
但是,请不要存储未加密的密码!