2016-02-25 89 views
-1

因此,从我所看到的情况来看,不可能解密诸如MD5或SHA-1之类的哈希算法,而不会强制它或使用彩虹表格。这似乎混淆了我在使用哈希的几个方面。这些令人困惑的问题是:散列的问题和它的问题?

  1. 如果散列不能被解密,首先会有什么意思?

  2. 哈希密码如何能够在数据库中使用?

  3. 另外,由于人们说它就像模操作一样,如果有的话,什么是阻止多个输入等同于相同的散列?

+1

存储明文密码不好,原因很明显。当用户登录时存储散列密码时,您不会解密散列并进行比较......您将加密密码并比较散列值。是的,这意味着从技术上讲,不止一个密码可以工作,但它们在数学上足够远以至于无关紧要。 [这是更完整的解释](http://stackoverflow.com/a/287738/119477) –

+0

[哈希和加密算法之间的根本区别]的可能重复(http://stackoverflow.com/questions/4948322/fundamental-哈希算法和加密算法之间的差异) –

回答

1

如果有人根本不SHA1或MD5一个密码,那么他们得到的几乎没有任何保护。

这就是为什么理解处理“密码哈希”的正确方法很重要。请阅读Our password hashing has no clothes

回答您的问题:

  1. 您可以验证没有“解密哈希”用户:你只是“散”的用户在登录时输入的密码(与盐和其他参数)并验证它是否与存储在数据库中的预期结果相匹配。

  2. 见1和特洛伊亨特链接

  3. 谁的人说,这就像一个模操作正在一个坏的比喻:他们在这个问题上非专业人士。无论如何,“散列”函数的属性使它很难找到冲突,并且盐可以防止具有相同密码的两个用户在数据库中拥有相同的密码“哈希”。

其他资源:

+0

好,只要它没有遵循链接但是如果你需要散列使用SHA-256或者SHA-512,一个好的免责声明不是使用SHA-1或MD5。对于“散列”密码,甚至不使用HMAC,请使用密钥派生函数,例如[PBKDF2](https://en.wikipedia.org/wiki/PBKDF2)或[bcrypt](https:// en。 wikipedia.org/wiki/Bcrypt)。 – zaph

0

它不像模数。基于输入,散列可以合理地保证是唯一的。如果您将密码作为散列输入到数据库中,那么您只需对密码条目进行散列处理,并根据存储在数据库中的内容进行检查。这样,您就不会将可读的密码存储在数据库中,这些密码对其他人是公开可见的。通常情况下,你会有一个私钥,一些盐和一些独特的东西,像散列算法中包含的时间戳,以确保它不容易被欺骗。

这可能会进一步帮助你: http://searchsqlserver.techtarget.com/definition/hashing

+0

注意,这是WRT密码哈希,还有其他类型,例如用于字典方法的字典方法,它们不需要避免冲突但是速度很快,这可能是模运算参考coes来自。 – zaph

0

即使散列的过程基本上是不解密,如之前指出的问题是,每个哈希几乎是唯一的,因此这意味着使用网站如md5decrypt其中包含了很多不同的话和他们的加密哈希值,一个可能会找到他正在寻找的密码。

那就是如果密码不够强大的话。显然不应该使用密码“密码”,因为它可能会在md5decrypt等大多数网站中找到。

你应该怎么做才能保护你网站上的密码其实很简单。首先,不要使用像md5或sha1这样的旧哈希。至少使用sha256,如果你有足够的sql存储,sha384或sha512。你应该知道,大多数在线哈希数据库都只是最常用的哈希(在大多数情况下,比如md5,sha1,sha256)。所以你应该找到一个在线数据库中不太表现的散列类型。

然后,你应该(实际上)在加密用户密码时使用salt,即在加密密码之前添加一些字,字母等等,然后将其存储在某个地方,这样您仍然可以让人们登录。你也可以添加一个pepper到盐中,使所有的事情变得更强。

在使用盐的同时,尝试找到黑客不会考虑的方法,例如双盐或三重盐,或尝试不同的方法来连接盐和实际密码等。您也可以用双盐加密,如sha512(sha384()),这几乎不可能找到。

但是,请不要存储未加密的密码!