深入密码加salt原理的分析


Posted in PHP onJune 06, 2013

我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如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值。

PHP 相关文章推荐
PHP删除HTMl标签的实现代码
Jun 30 PHP
一个php短网址的生成代码(仿微博短网址)
May 07 PHP
PHP整数取余返回负数的相关解决方法
May 15 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
php实现判断访问来路是否为搜索引擎机器人的方法
Apr 15 PHP
PHP的反射机制实例详解
Mar 29 PHP
PHP编程计算文件或数组中单词出现频率的方法
May 22 PHP
PHP 使用二进制保存用户状态的实例
Jan 29 PHP
PHP7.1实现的AES与RSA加密操作示例
Jun 15 PHP
PHP进阶学习之反射基本概念与用法分析
Jun 18 PHP
laravel框架的安装与路由实例分析
Oct 11 PHP
Laravel框架源码解析之模型Model原理与用法解析
May 14 PHP
深入理解PHP几个算法:PHP冒泡、PHP二分法、PHP求素数、PHP乘法表
Jun 06 #PHP
php定时计划任务的实现方法详解
Jun 06 #PHP
PHP使用DES进行加密与解密的方法详解
Jun 06 #PHP
php xml常用函数的集合(比较详细)
Jun 06 #PHP
PHP5函数小全(分享)
Jun 06 #PHP
解析php时间戳与日期的转换
Jun 06 #PHP
基于header的一些常用指令详解
Jun 06 #PHP
You might like
当年上海收录机产品生产,进口和价格情况
2021/03/04 无线电
html中select语句读取mysql表中内容
2006/10/09 PHP
PHP session有效期问题
2009/04/26 PHP
PHP正则的Unknown Modifier错误解决方法
2010/03/02 PHP
php检测apache mod_rewrite模块是否安装的方法
2015/03/14 PHP
PHP创建多级目录的两种方法
2016/10/28 PHP
PHP 判断字符串是中文还是英文, 或者是中英混合
2021/03/09 PHP
javascript 获取图片颜色
2009/04/05 Javascript
JavaScript高级程序设计 扩展--关于动态原型
2010/11/09 Javascript
自制基于jQuery的智能提示插件一枚
2011/02/18 Javascript
js拦截alert对话框另类应用
2013/01/16 Javascript
jQuery调用AJAX时Get和post公用的乱码解决方法实例说明
2013/06/04 Javascript
js innerHTML 改变div内容的方法
2013/08/03 Javascript
浅析javascript操作 cookie对象
2014/12/26 Javascript
JS实现简单的二维矩阵乘积运算
2016/01/26 Javascript
bootstrap IE8 兼容性处理
2017/03/22 Javascript
JavaScript数组去重的多种方法(四种)
2017/09/19 Javascript
详解为Bootstrap Modal添加拖拽的方法
2018/01/05 Javascript
Mac下安装vue
2018/04/11 Javascript
Javascript幻灯片播放功能实现过程解析
2020/05/07 Javascript
[01:35]2018年度CS GO最佳战队-完美盛典
2018/12/17 DOTA
[02:55]含熏伴清风,风行者至宝、屠夫身心及典藏宝瓶二展示
2020/09/08 DOTA
[46:38]完美世界DOTA2联赛PWL S2 Magma vs PXG 第三场 11.28
2020/12/02 DOTA
python使用xslt提取网页数据的方法
2018/02/23 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
Python pygorithm模块用法示例【常见算法测试】
2018/08/16 Python
python分数表示方式和写法
2019/06/26 Python
python支持多线程的爬虫实例
2019/12/21 Python
python判断链表是否有环的实例代码
2020/01/31 Python
Europcar澳大利亚官网:全球汽车租赁领域的领导者
2019/03/24 全球购物
存储过程的优缺点是什么
2015/01/10 面试题
初中音乐教学反思
2014/01/12 职场文书
2014年社区党建工作总结
2014/11/11 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
apache基于端口创建虚拟主机的示例
2021/04/24 Servers
2022漫威和DC电影上映作品
2022/04/05 欧美动漫