Username, Password, Salting, Encrypting, Hash - How does it all work?
Possible Duplicate:
Secure hash and salt for PHP passwords
我在StackOverflow和其他网站上读了很多关于网络安全的文章。比如盐渍加密等,我不太明白,所以简单的解释会很有帮助。
这就是我目前所知道的。用户登录时输入用户名和密码。然后输入经过一个过程。假设用户名和密码组合如下:
1 2 3 | $username = (USERS USERNAME INPUT); $password = (USERS PASSWORD INPUT); $userinput = $username . $password; |
然后我们加些盐。
1 2 3 4 | $salt1 ="13$13aVc!kd"; $salt2 ="4kr$!vlmeoc"; $salted = $salt1 . $userinput . $salt2; |
然后我们加密它。
1 | $encrypted = encrypt($salted); |
然后检查数据库,看看它的正确用户是否登录。
这就是它的工作原理,对吗?但我读过关于暴力攻击的文章。它猜对了输入值?按照上面的步骤。这是否表明攻击者只需要获得正确的$userinput信息就可以进入?他不需要猜长的$加密字符串对吗?
注意:假设在这种情况下,没有验证码,没有尝试次数限制,没有锁定,只有上面的一个。
注意:温柔点,我还在学习。
如果你排除了Captchas,试试限制,封锁等等…然后是的。你只需要强制使用纯文本字符串。
但是,这确实需要时间——至少,它受服务器响应登录请求的速率的限制。即使开发人员没有添加任何防止暴力强制的措施,服务器本身也只能如此快速地通过加密+验证过程,并且只能处理如此多的并行请求。
也就是说,这就是为什么
- 作为一个用户,使用一个强大的,难以暴力的密码
- 作为一个开发人员,有足够的措施来防止您的登录过程的暴力强迫。
散列和加盐密码并不是为了保护那些蛮横地强制自然登录过程的人(还有其他事情可以保护他们)。相反,它们是为了防止密码存储本身的潜在危害(例如,有人转储数据库的内容)。
哈希和salting都有助于降低访问存储密码的人检索纯文本字符串的速度,他们需要能够通过自然登录过程(您的站点或其他站点,考虑到站点之间通常共享密码),而不会触发反暴力强制安全措施。
哈希和salting的思想更多的是防止在数据库本身受到破坏时有人获取用户密码。如果密码存储为salt和hash字符串,则攻击者不能仅使用它们访问另一个站点上的用户帐户。
密码加密是单向加密(或者更确切地说,它应该在安全站点中)。也就是说,你拿了密码,然后把它做成一个哈希表。例如,Bcrypt是目前可以接受的标准。
如果它的单向加密,很多人都想知道它如何检查密码。但您只需散列用户提交的密码,并将其与存储在数据库中的散列进行比较。这样,如果数据库被偷,攻击者就必须更加努力地工作。
仅仅散列一个密码的问题很容易是野蛮的强制或彩虹表。你可以通过谷歌彩虹表了解更多信息。但从本质上讲,这是将这些散列值转换回密码的一种方法。
进入盐渍。salting本质上是在每个密码中添加随机数据。这胜过彩虹桌。意味着受损的数据库将意味着暴力。如果你使用类似bcrypt的散列系统,那么对被攻击的人来说需要花费大量的时间和精力。
说了这么多。最好不要重新发明轮子。如果可以,只需使用已知良好的授权系统。
暴力攻击的一个问题是,当您使用像sha1或md5这样的快速加密时。这些函数的构建是为了通过一个算法快速地运行密码。相反,您可以使用Blowfish方法,我不擅长这种方法,但长话短说,它需要比sha1或md5更多的返回值计算。这意味着可能需要5年的时间来强行输入密码,因为计算时间长,密码会与河豚一起散列。
下一个例子是用sha1和md5制作的,因此它很容易受到野蛮攻击,但是salt部分应该可以使用:
这将输出一个唯一的32个字符的salt,并将其与密码放在一起。
1 2 |
现在您必须将密码和salt都存储在数据库中。当你检查用户输入的密码时,你会得到盐,然后把它散列出来。
1 2 3 4 5 6 7 8 9 10 11 12 | $temp_pass = $_POST['temp_pass']; $salt=//from database; $database_pass = //hashed pass from database; $hashed_temp_pass = sha1($temp_pass.$salt); if(hashed_temp_pass == $database_pass){ //Welcome user! } else{ //go away } |
在这里看到我的答案
当您创建散列时,应该为每个条目生成唯一的盐。