深入密码加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 相关文章推荐
详细介绍:Apache+PHP+MySQL配置攻略
Sep 05 PHP
php 删除目录下N分钟前创建的所有文件的实现代码
Aug 10 PHP
php对数组排序的简单实例
Dec 25 PHP
PHP实现下载断点续传的方法
Nov 12 PHP
PHP下载远程文件到本地存储的方法
Mar 24 PHP
php单一接口的实现方法
Jun 20 PHP
php实现word转html的方法
Jan 22 PHP
PHP 绘制网站登录首页图片验证码
Apr 12 PHP
PHP接口继承及接口多继承原理与实现方法详解
Oct 18 PHP
浅谈laravel中的关联查询with的问题
Oct 10 PHP
php使用gearman进行任务分发操作实例详解
Feb 26 PHP
基于PHP+mysql实现新闻发布系统的开发
Aug 06 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
php中的MVC模式运用技巧
2007/05/03 PHP
php读取msn上的用户信息类
2008/12/05 PHP
SCP远程VPS快速搬家和WDCP升级php5.3安装memcached和eaccelerator教程
2017/07/27 PHP
PHP多进程编程之僵尸进程问题的理解
2017/10/15 PHP
javascript 屏蔽鼠标键盘的几段代码
2008/01/02 Javascript
jquery1.4.2 for Visual studio 2010 模板文件
2010/07/14 Javascript
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
Javascript仿PHP $_GET获取URL中的参数
2014/05/12 Javascript
选择复选框按钮置灰否则按钮可用
2014/05/22 Javascript
jquery 为a标签绑定click事件示例代码
2014/06/23 Javascript
jQuery插件Skippr实现焦点图幻灯片特效
2015/04/12 Javascript
仅30行代码实现Javascript中的MVC
2016/02/15 Javascript
jQuery复合事件结合toggle()方法的用法示例
2017/06/10 jQuery
解决Angular.js中使用Swiper插件不能滑动的问题
2018/02/26 Javascript
Vue中实现权限控制的方法示例
2019/06/07 Javascript
vue中activated的用法
2021/01/03 Vue.js
python实现的一只从百度开始不断搜索的小爬虫
2013/08/13 Python
Python获取apk文件URL地址实例
2013/11/01 Python
python实现爬虫下载漫画示例
2014/02/16 Python
Python 内置函数memoryview(obj)的具体用法
2017/11/23 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
如何在mac环境中用python处理protobuf
2019/12/25 Python
Django后端分离 使用element-ui文件上传方式
2020/07/12 Python
Python猫眼电影最近上映的电影票房信息
2020/09/18 Python
Django生成数据库及添加用户报错解决方案
2020/10/09 Python
美国药妆网站:EDCskincare.com(防晒、痤疮、抗衰老等)
2017/04/28 全球购物
广州御银科技股份有限公司试卷(C++)
2016/11/04 面试题
岳父生日宴会答谢词
2014/01/13 职场文书
公司门卫岗位职责
2014/03/15 职场文书
工程负责人任命书
2014/06/06 职场文书
关于保护环境的标语
2014/06/09 职场文书
白酒代理协议书范本
2014/10/26 职场文书
2014年幼儿园后勤工作总结
2014/11/10 职场文书
Python中相见恨晚的技巧
2021/04/13 Python
Django框架中模型的用法
2022/06/10 Python
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技