`

MD5加密算法中的salt

    博客分类:
  • php
 
阅读更多

FROM:http://blog.csdn.net/blade2001/article/details/6341078

 

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

用户注册时,

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

用户登录时,

  1. 用户输入【账号】和【密码】;
  2. 系统通过用户名找到与之对应的【Hash值】和【Salt值】;
  3. 系统将【Salt值】和【用户输入的密码】连接到一起;
  4. 对连接后的值进行散列,得到【Hash值2 】(注意是即时运算出来的值);
  5. 比较【Hash值1 】和【Hash值2 】是否相等,相等则表示密码正确,否则表示密码错误。

有时候,为了减轻开发压力,程序员会统一使用一个salt值(储存在某个地方),而不是每个用户都生成私有的salt值。

分享到:
评论

相关推荐

    用Javascript写的md5加密算法

    用Javascript写的md5加密算法,可直接调用!

    Mybatics,前端AJAX技术,SpringBoot、mysql、md5加密算法实现登录注册

    Mybatics,前端AJAX技术,SpringBoot、md5加密算法实现登录注册,在后端随机生成Salt值,然后采用MD5算法加密密码,将密码密文和salt值存入MYSQL数据

    md5散列加密算法 强大的工具

    加密算法,增加写代码的效率。很强的算法。。。。。。。。

    登陆加密MD5+Salt+SHA1附代码

    SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出...

    md5 example with openssl

    example of md5 with openssl,使用openssl完成MD5加密算法。

    GNUc的md5源码

    标准GNU C2.1版本的MD5带salt值的加密算法源码。

    php 的加密函数 md5,crypt,base64_encode 等使用介绍

    不可逆的加密函数为:md5()、crypt() md5() 用来计算 MD5 哈稀。语法为:string md5(string str); crypt() 将字符串用 UNIX 的标准加密 DES 模块加密。这是单向的加密函数,无法解密。欲比对字符串,将已加密的字符...

    Arduino、有限的微控制器和其他嵌入式系统的字符串加密_C语言_代码_相关文件_下载

    Cape是一个实验项目,应该用于研究和教育目的,不应该用于生产。Cape 3.0 已发布在 ...将进行进一步研究以确定在该库中应用一种新的、更安全的加密算法的可行性。 更多详情、使用方法,请下载后阅读README.md文件

    C#使用 Salt + Hash 来为密码加密

    本文主要介绍了几种常见的破解密码的方法,为密码加盐(Salt)以及在.NET中的实现等。具有一定的参考价值,下面跟着小编一起来看下吧

    API接口手工防御被恶意调用和接口被攻击

    接口参数的加解密,通过md5加密数据+时间戳+随机字符串(salt),然后将MD5加密的数据和时间戳、原数据均传到后台,后台规定一个有效时长,如果在该时长内,且解密后的数据与原数据一致,则认为是正常请求;也可以采用...

    PHP内置加密函数详解

    Md5()加密算法 方式: 单向加密 语法: md5(string $str [, bool $raw_output = false]) $str:原始字符串 $raw_output:如果可选的raw_output被设置为true, 那么md5报文摘要将以16字节长度的原始二进制格式返回. 返回以...

    在Linux中使用MD5实现用户验证的解决方法

    使用openssl中的MD5函数,该函数返回16字节的unsigned char类型的数据,每个字节的范围都在0~255间,把 它格式化为十六进制就是32位md5编码。注:一个字节为8位,正好可以表示2位的十六进制。 使用登录客户端的...

    java jasypt包PBEWithMD5AndDES算法加解密C#版

    Java 使用jasypt包辅助,实现密码加解密。本方法实现了C#版,适用于一方加密另一方解密的情况,根据默认配置改版,可在当前版本基础上自定义更改指定算法、hash迭代次数、salt生成方式等

    Python内置加密模块用法解析

    这篇文章主要介绍了Python内置加密模块用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者...主要提供了一些常见的单向加密算法(如MD5,SHA等) hmac 单向加密算法,支持设置一个额外的密匙(salt)来提高

    PHP常见加密函数用法示例【crypt与md5】

    crypt()函数用于返回使用DES、Blowfish或MD5算法加密过后的字符串,crypt(str,salt)接受2个参数,第1个为需要加密的字符串,第2个为盐值(加密干扰值,如果没有提供,则默认由PHP自动生成),返回的字符串为散列的...

    浅谈discuz密码加密的方式

    discuz注册时,会把密码按一个规则加密。 ...复制代码 代码如下:echo md5(...第一次md5后的值再加上盐值(salt)再进行md5,就是要得到的值了。 试一下 复制代码 代码如下:echo md5(md5(‘123456′).’d82a35’); 

    shiro安全管理框架之Cryptography.docx

    散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5、SHA等。一般进行散列时最好提供一个salt(盐),比如加密密码“admin”,产生的散列值是“21232f297...

    PHP实现的单向散列加密操作示例

    本文实例讲述了PHP实现的单向散列加密操作。分享给大家供大家参考,具体如下: ...//或者$sha1=md5($str.$salt); echo $str; echo " "; echo $sha1; echo " "; echo "http://localhost//sha1_de

    PHP crypt()函数的用法讲解

    crypt() 函数返回使用 DES、Blowfish 或 MD5 算法加密的字符串。 在不同的操作系统上,该函数的行为不同,某些操作系统支持一种以上的算法类型。在安装时,PHP 会检查什么算法可用以及使用什么算法。 确切的算法依赖...

    问答系统的系统设计方案.pdf

    ⽤户表的密码通常使⽤MD5等不可逆算法加密后存储,为防⽌彩虹表破解更会先使⽤⼀个特定的字符串加密,然后再使⽤⼀ 个随机的salt加密。 特定字符串是程序代码中固定的,salt是每个密码单独随机,⼀般给⽤户表加⼀个...

Global site tag (gtag.js) - Google Analytics