查看: 12647|回复: 9
收起左侧

[分享] 哈希加盐法(HASH+SALT)中的加盐值(SALT)

[复制链接]
chujunci
发表于 2011-12-31 17:17:20 | 显示全部楼层 |阅读模式
我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码。

  加Salt可以一定程度上解决这一问题。所谓加Salt方法,就是加点“佐料”。其基本想法是这样的:当用户首次提供密码时(通常是注册时),由系统自动往这个密码里撒一些“佐料”,然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的“佐料”,然后散列,再比较散列值,已确定密码是否正确。

  这里的“佐料”被称作“Salt值”,这个值是由系统随机生成的,并且只有系统知道。这样,即便两个用户使用了同一个密码,由于系统为它们生成的salt值不同,他们的散列值也是不同的。即便黑客可以通过自己的密码和自己生成的散列值来找具有特定密码的用户,但这个几率太小了(密码和salt值都得和黑客使用的一样才行)。

下面以PHP示例,讲解md5($pass.$salt)加密函数。

<?php
function hash($a) {
    $salt=”Random_KUGBJVY”;  //定义一个salt值,程序员规定下来的随机字符串
    $b=$a.$salt;  //把密码和salt连接
    $b=md5($b);  //执行MD5散列
    return $b;  //返回散列   
}
?>

  调用方式:$new_password=hash($_POST[password]);   //这里接受表单提交值,并进行加密

  下面详细介绍一下加Salt散列的过程。介绍之前先强调一点,前面说过,验证密码时要使用和最初散列密码时使用“相同的”佐料。所以Salt值是要存放在数据库里的。

用户注册时,

用户输入【账号】和【密码】(以及其他用户信息);
系统为用户生成【Salt值】;
系统将【Salt值】和【用户密码】连接到一起;
对连接后的值进行散列,得到【Hash值】;
将【Hash值1】和【Salt值】分别放到数据库中。
用户登录时,

用户输入【账号】和【密码】;
系统通过用户名找到与之对应的【Hash值】和【Salt值】;
系统将【Salt值】和【用户输入的密码】连接到一起;
对连接后的值进行散列,得到【Hash值2】(注意是即时运算出来的值);
比较【Hash值1】和【Hash值2】是否相等,相等则表示密码正确,否则表示密码错误。
有时候,为了减轻开发压力,程序员会统一使用一个salt值(储存在某个地方),而不是每个用户都生成私有的salt值。

您是否遇见过破解不了的MD5值?你是否遇见过‘奇形怪状’的hash?这些非常有可能就是带有salt(俗称加盐值),本文将为大家简单的介绍关于加盐值的一些信息。

0×01. 什么是加盐值?
为了加强MD5的安全性(本身是不可逆的),从而加入了新的算法部分即加盐值,加盐值是随机生成的一组字符串,可以包括随机的大小写字母、数字、字符,位数可以根据要求而不一样,使用不同的加盐值产生的最终密文是不一样的。



0×02. 代码中如何使用加盐值?
由于使用加盐值以后的密码相当的安全,即便是你获得了其中的salt和最终密文,破解也是一个耗费相当多时间的过程,可以说是破解单纯MD5的好几倍,那么使用加盐值以后的密文是如何产生的呢?
1).首先我们得到的是明文的hash值
2).进行计算获取MD5明文hash值
3).随机生成加盐值并插入
4).MD5插入加盐值得到的hash
5).得到最终的密文



0×03. 如何破解出带有加盐值的密文
因为像windows hash(未进行syskey加密)、非加盐值MD5等都可以通过大型的密码(如彩虹表)表进行对比解密,所以相对而言相当的轻松,而带有加盐值的密文就相对而言复杂的多,现在的MD5表大概是260+G,如何加盐值的可能性有10000个,那么密码表的应该是MD5 size*10000,就可以解密出原MD5表能够解密的密码了,一些网站也提供了对应的salt解密,但是测试以后效果并不是非常好,如常规的admin888也未解密出,实在是遗憾,毕竟MD5本是不可逆的,带入随机值解密出最终密码的可能性就更低了,至少是相对大多数人而言的。



0×04. 含加盐值MD5算法的应用
目前多家的网站程序公司都已经加入了该算法,如常见的VBB论坛、discuz论坛等都采用了,甚至著名的Linux开源操作系统早已经加入了这种加密模式。可得而知,这种算法势必会在未来应用于更多的范围。


转自:http://blog.csdn.net/blade2001/article/details/6341078
zhq445078388
发表于 2011-12-31 18:23:30 | 显示全部楼层
有一种办法是多重干扰 分布散列 然后扭曲存储
http://bbs.kafan.cn/thread-1182606-1-1.html
简简单单做出来 64位长的一串代码 基本上可以只代表这一对密钥
至于说 基本上 是因为世事无绝对 我怕吹牛皮被戳破了
飞奔万里
发表于 2011-12-31 22:05:55 | 显示全部楼层
看不懂
iezhaoie
头像被屏蔽
发表于 2011-12-31 22:06:38 | 显示全部楼层
同上
jefffire
头像被屏蔽
发表于 2011-12-31 22:13:25 | 显示全部楼层
本帖最后由 jefffire 于 2011-12-31 22:17 编辑

加盐还是有问题的。如果每个用户加的盐都是一样的,那么黑客事先先注册较大数量的账户,然后通过"脱裤"后就能得到一张密码和存储的哈希值对应表,然后再加上常见弱口令的统计分析,能够比较容易逆推出加的到底是什么盐。

所以加盐必须做到每人的盐都不一样,每个网站的盐也不同。这样就能较为有效的对抗彩虹表
chujunci
 楼主| 发表于 2011-12-31 22:23:33 | 显示全部楼层
jefffire 发表于 2011-12-31 22:13
加盐还是有问题的。如果每个用户加的盐都是一样的,那么黑客事先先注册较大数量的账户,然后通过"脱裤"后就 ...

那要是随机生成加盐值并插入呢?使用不同的加盐值产生的最终密文是不一样的。
可能这样的话,系统后台就不好办了!
-oAo-
发表于 2011-12-31 22:41:31 | 显示全部楼层
看不懂
157973696
头像被屏蔽
发表于 2011-12-31 23:53:17 | 显示全部楼层
哈希加盐法这个名字看着让人口渴, 话说网传的银行密码泄露已经确认是谣传了.
chujunci
 楼主| 发表于 2011-12-31 23:56:17 | 显示全部楼层
157973696 发表于 2011-12-31 23:53
哈希加盐法这个名字看着让人口渴, 话说网传的银行密码泄露已经确认是谣传了.

银行根本就没有泄密!如果要泄密的话,,,哼哼!!那就.......你懂得!
yjwfdc
头像被屏蔽
发表于 2012-1-1 00:09:01 | 显示全部楼层
想不到我自己想出来的办法叫加盐。

银行系统可以这样加盐,用户名其中一个字加身份证某位的一个字加银行固定的100个字作为盐,加到用户密码上再哈希。

您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-1-22 12:47 , Processed in 0.225059 second(s), 16 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表