php用户名密码加密,关于php:用户名,密码,Salting,加密,哈希 – 它们如何运作?...

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:

Secure hash and salt for PHP passwords

我在StackOverflow和其他网站上读了很多关于网络安全的文章。比如盐渍加密等,我不太明白,所以简单的解释会很有帮助。

这就是我目前所知道的。用户登录时输入用户名和密码。然后输入经过一个过程。假设用户名和密码组合如下:

$username = (USERS USERNAME INPUT);

$password = (USERS PASSWORD INPUT);

$userinput = $username . $password;

然后我们加些盐。

$salt1 ="13$13aVc!kd";

$salt2 ="4kr$!vlmeoc";

$salted = $salt1 . $userinput . $salt2;

然后我们加密它。

$encrypted = encrypt($salted);

然后检查数据库,看看它的正确用户是否登录。

这就是它的工作原理,对吗?但我读过关于暴力攻击的文章。它猜对了输入值?按照上面的步骤。这是否表明攻击者只需要获得正确的$userinput信息就可以进入?他不需要猜长的$加密字符串对吗?

注意:假设在这种情况下,没有验证码,没有尝试次数限制,没有锁定,只有上面的一个。

注意:温柔点,我还在学习。

这就是为什么建议用户使用强密码而不是"12345",但在您的场景中可能使用暴力。

所以盐和加密是没用的?

有点像,但是如果被劫持的日期介于两者之间,那么劫持者就没有用了,因为它将是加密字符串,并且在没有salt值之前无法逆转。

salt和加密并不是无用的-它们在数据库被破坏时保护用户密码…无障碍的蛮力基本上可以打开任何东西…及时;)

写了一个关于安全密码存储的教程,也许可以帮助您。

如果你排除了Captchas,试试限制,封锁等等…然后是的。你只需要强制使用纯文本字符串。

但是,这确实需要时间——至少,它受服务器响应登录请求的速率的限制。即使开发人员没有添加任何防止暴力强制的措施,服务器本身也只能如此快速地通过加密+验证过程,并且只能处理如此多的并行请求。

也就是说,这就是为什么

作为一个用户,使用一个强大的,难以暴力的密码

作为一个开发人员,有足够的措施来防止您的登录过程的暴力强迫。

散列和加盐密码并不是为了保护那些蛮横地强制自然登录过程的人(还有其他事情可以保护他们)。相反,它们是为了防止密码存储本身的潜在危害(例如,有人转储数据库的内容)。

哈希和salting都有助于降低访问存储密码的人检索纯文本字符串的速度,他们需要能够通过自然登录过程(您的站点或其他站点,考虑到站点之间通常共享密码),而不会触发反暴力强制安全措施。

@用户1429811如果你想要更多的阅读,我有一个关于这个主题的完整的博客文章-codingkilledthecat.wordpress.com/2012/09/04/…

哈希和salting的思想更多的是防止在数据库本身受到破坏时有人获取用户密码。如果密码存储为salt和hash字符串,则攻击者不能仅使用它们访问另一个站点上的用户帐户。

密码加密是单向加密(或者更确切地说,它应该在安全站点中)。也就是说,你拿了密码,然后把它做成一个哈希表。例如,Bcrypt是目前可以接受的标准。

如果它的单向加密,很多人都想知道它如何检查密码。但您只需散列用户提交的密码,并将其与存储在数据库中的散列进行比较。这样,如果数据库被偷,攻击者就必须更加努力地工作。

仅仅散列一个密码的问题很容易是野蛮的强制或彩虹表。你可以通过谷歌彩虹表了解更多信息。但从本质上讲,这是将这些散列值转换回密码的一种方法。

进入盐渍。salting本质上是在每个密码中添加随机数据。这胜过彩虹桌。意味着受损的数据库将意味着暴力。如果你使用类似bcrypt的散列系统,那么对被攻击的人来说需要花费大量的时间和精力。

说了这么多。最好不要重新发明轮子。如果可以,只需使用已知良好的授权系统。

暴力攻击的一个问题是,当您使用像sha1或md5这样的快速加密时。这些函数的构建是为了通过一个算法快速地运行密码。相反,您可以使用Blowfish方法,我不擅长这种方法,但长话短说,它需要比sha1或md5更多的返回值计算。这意味着可能需要5年的时间来强行输入密码,因为计算时间长,密码会与河豚一起散列。

下一个例子是用sha1和md5制作的,因此它很容易受到野蛮攻击,但是salt部分应该可以使用:

$salt=md5(microtime().uniqueid());

这将输出一个唯一的32个字符的salt,并将其与密码放在一起。

$passwod = $_POST['password'];

$hashed_password = sha1($password.$salt);

现在您必须将密码和salt都存储在数据库中。当你检查用户输入的密码时,你会得到盐,然后把它散列出来。

$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

}

在这里看到我的答案

当您创建散列时,应该为每个条目生成唯一的盐。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值