222
发新话题
打印

PHP密码的安全性

PHP密码的安全性

如果你建了个需要用户注册的网站,那么你就有责任保证用户登陆密码的安全。如果把他们的密码用明码存放,那你就失职了。你会觉得用明码存放密码,像Reddit网站一样,可以让用户用得更方便。就算我同意你的看法,但如果你的数据库像Reddit网站一样被偷了呢?那时损失的不单是你自己的网站,因为用户通常在多个网站都用同一个登陆密码,这样,那些网站也跟着倒霉了。

任何数据都不是绝对安全的,想想任何人都可以接触你的服务器(是不是有公司替你管理服务器?),接触你的数据库(是不是有公司替你备份数据?),但你对此却无能为力。也就是说你的数据库被偷的机会是很大的。那么,最简单的(安全措施)就是对用户的登陆密码加密。

哈希方法(Hashing)

Hash是将原密码运用单向算法运算后得出的字符串。换句话说,就是加密很容易,解密极困难(如果应用得法,解密几乎不可能)。 先将加密结果(Hash)放在数据库里,当用户登录时,可将其登录密码加密(Hash)后,再与之前放在数据库中的结果比对。如下例
复制内容到剪贴板
代码:
if( $user->passwordhash == sha1( $_POST['password'] ) )

(shal : Secure Hash Algorithm .译者注)
PHP有好几种加密算法,md5 和sha1 是用的最多的。但两者都没有人们想象的那么安全。应该用更安全的算法,安装加密引擎(PHP 5.1.2以上已内置) 后可有更多算法可用。以下是更棒的例子
if( $user->passwordhash == hash( 'whirlpool', $_POST['password'] ) )

彩虹表 (Rainbow tables)
但还有个问题,偷窃者偷取数据库后,就有大量的时间使用彩虹表来破解。其原理是将常用词(比如从字典中提取每个词)加密后的字符串比对数据库里的字符串。
用不了个把小时,近半的密码可能已被破解。

防范措施就是在每个密码加密时增加一段随机产生的字符(可叫其变形算法或随便什么)。耗时的彩虹表攻击法是基於字典的词。要破解加料后的密码,就要根据增加的每一个字符重建一本字典,攻击会因太耗时而不能成事。每个密码都要附加一段不同的字符,字符本身就根本不用加密。

例子
安全加密方法如下 $user->passwordhash == hash( 'whirlpool', $_POST['password'] ) )[/code]
复制内容到剪贴板
代码:
// get a new salt - 8 hexadecimal characters long
// current PHP installations should not exceed 8 characters
// on dechex( mt_rand() )
// but we future proof it anyway with substr()
function getPasswordSalt()
{
    return substr( str_pad( dechex( mt_rand() ), 8, '0',STR_PAD_LEFT ), -8 );
}
// calculate the hash from a salt and a password
function getPasswordHash( $salt, $password )
{
    return $salt . ( hash( 'whirlpool', $salt . $password ) );
}
// compare a password to a hash
function comparePassword( $password, $hash )
{
    $salt = substr( $hash, 0, 8 );
    return $hash == getPasswordHash( $salt, $password );
}
// get a new hash for a password
$hash = getPasswordHash( getPasswordSalt(), $password );
加料字符用不着加密,你可将其分存在数据库中,但我个人喜欢把其连成一串。同样的,加料字符用不着变成十六进制,但我喜欢用和哈希字符串一样的十六进制的格式。
最后,正如Thomas Ptacek说的,你没必要用世界上最快的算法来加密,它是留给攻击者用的。
转载:PHPCHINA
成功只有努力去奋斗!

TOP

不懂php  所以也看不懂

TOP

加密技术属于信息安全领域范畴 PHP不过是是简化应用而已
上述算法未必就有叙述的那么强
所以最好的方法就是经常更改强壮的密码
做好站 !  做好站 !
一个代表决心,一个代表质量!

TOP

那是,加密只是为了少些的安全性
如果遇到了高手,在难的密码也无济于事
宝剑锋从磨砺出
梅花香自苦寒来

TOP

只知道MD5,SHA
路漫漫其修远兮,吾将上下而求索!

TOP

听说有人把md5全部算出来存在硬盘上,查询很方便
不过估计位数比较少的,如果位数多的数据量太大了,所以设置密码一定要长,至少8位以上吧

TOP

回复 6# 的帖子

牛人一个..不过如果是SHA加密的估计要想算出来就有些难度了...SHA是64位的...那可不是一般的长啊
路漫漫其修远兮,吾将上下而求索!

TOP

ls见解正是,如果那样加密的话
不容易破解
成功只有努力去奋斗!

TOP

我基本上就用MD5加密、不过我只是取其中的一部分。比如加密后的字符串有32位。而我只提取其中的5-10位和12-23位。这样等。
我觉得这样会进一步加大密码破解难度

TOP

发新话题