我对构造散列函数的理解

    网站虽然会hash用户的密码然后保存在数据库中,但是网站却可以知道用户密码,网站冒充用户很容易。构造散列函数只能提供“单向”的验证。非对称加密验证就“功能”而言更强大,但hash对网站来说够用,运算速度又快于des(可能是单向散列无须考虑解密),更别说非对称了。

    MD5被王小云破解了。假设123456和654321的md5值一样,你用123456得到一个md5值,你用王氏算法用一小时得到了654321的结果。对于文件验证来说,应该并没有什么用,因为‘123456’可能是个文本文件或一个exe,‘654321’只是一堆乱码,一个不可执行的文件。对于网站对用户的验证,大家看看下面的php程序(抄php手册):

function doubleSalt($toHash,$username)
{
  $centerSalt = 'centerSalt'
  $password = str_split($toHash,(strlen($toHash)/2)+1);   
  $str = $username.$password[0].$centerSalt.$password[1];  
  return md5($str);
}

很明显,有了username一起hash以后,碰撞难度增加了,比如‘王123456’的md5值,却要得到‘王654321’。况且password中间还插了个centerSalt。

如果你觉得还不放心,可以把‘$str =’这句后改成:
  $hash = pack( "H*", sha1($str) );
  $md5 = pack( "H*", md5($str) );
  $hash ^= $md5 . $centerSalt;
  
  return bin2hex( $hash );
  //return base64_encode( $hash );//省空间
但是,速度会慢一些。


    另外,暴力破解md5也不是很可行,因为就是单纯把密码md5——我们假设一个网站把密码的取值范围定在' ' > toHash > '~',每位密码就有95种组合,八位就是95^8=6634204312890630 。 我们再假设一个人有一台电脑,这台电脑每秒能算一万种md5值,那他让电脑日夜不息也要花2万年才能破解。当然,现在有云计算,假设他和网吧老板们有关系,网吧的电脑假设有一半时间开着,并用四分之一的计算能力为他算,为他服务的有16万台网吧电脑,那么他一年就可以算出。当然,这代价很大,且在用户名和密码一起md5后,花这么大力,只能破解一人的密码。

    当然,如果一个人用的是密码简单,或者正好和CSDN等网站泄密了的密码一样,网站除非不让他用这种密码,要不然也没有办法。

    说到密码安全,有人说可以用构造散列函数生成密码,这是一种非常好的方法,比如md5值是32位16种组合,这种密码强度非常强。但一般来说,生成md5值的是简单好记的东西,这东西对于密码来说没有大的保密作用,重要的是对于产生密码的方法的保密。但好在构造散列函数有多种,自己写代码,把tohash加不同的盐,再用不同的散列函数hash,再把这些十六进制转成字节流,再把它们取一定长度位运处。再转成base码或十六进制,就可以作密码。当然为了保险起见(你写的源代码可能泄露),还是自己再多记几位密码的好。


最近看了个有关md5的贴子,觉得很有创意,内容大意如下:

    每次登陆时,服务器会产生不同的随机字符串,然后客户端(用javascript)将这个随机字符串和密码相加后再md5传给服务器,服务器用存好的密码与发出的随机字符串合并,再计算md5对比结果。这里说的密码也可以是MD5的结果。

    这方法虽好,但有两个问题,一是用户不用javascript,但问题不大;二是如果“泄库”了,就可以直接用密码或MD5直接登陆了。

    实际上用https可以解决这个问题,一、保证密码的安全传输,二、让用户可以通过自己电脑上的证书验证网站的真伪。但大家都知道一个道理,解决一个问题,就会有新的问题。一、花钱买证书;二、https较耗服务器计算资源;三、https是加密信息,好的加密是无法压缩的,所以占流量;四、容易丢包:网上的加密信息很容易被认出,因为一般情况下加密信息无法压缩,也无法解压。坏人会对这些信息进行攻击。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值