文章目录

  • 2.6.MD5算法与Salt
    • MD5算法的作用和特点
    • Salt
    • 注册,登录流程
    • 实现
      • 对密码使用MD5+Slat,并进行hash加密
      • 自定义realm实现在用户登录的时候进行比对

2.6.MD5算法与Salt

MD5算法的作用和特点

  • 作用:一般用来加密或者签名(校验和)
  • 特点:MD5算法不可逆,如果内容相同无论执行多少次md5生成结果始终是一致

Salt

我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码。

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

这里的“佐料”被称作“Salt值”,这个值是由系统随机生成的,并且只有系统知道。这样,即便两个用户使用了同一个密码,由于系统为它们生成的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值。

实现

对密码使用MD5+Slat,并进行hash加密

 // 这里的用户名密码是为了模拟提交的身份信息static final String user_name = "张三";static final String password = "123456";// 使用固定的slat值加密static final String slat = "we#ewe^sd*";// 使用hash加密的次数static final int hashInterations = 1024;public static void main(String[] args) {Md5Hash md5Hash;// 使用md5md5Hash = new Md5Hash(password);System.out.println(md5Hash.toHex());// 使用md5+slatmd5Hash = new Md5Hash(password, slat);System.out.println(md5Hash.toHex());// 使用md5+slat+hash散列md5Hash = new Md5Hash(password, slat, hashInterations);System.out.println(md5Hash.toHex());}

自定义realm实现在用户登录的时候进行比对

1,自定义realm

public class MD5AndSaltRealm extends AuthenticatingRealm {// 使用固定的slat值加密static final String slat = "we#ewe^sd*";/*** * 1. 用户输入【账号】和【密码】;* * 2. 系统通过用户名找到与之对应的【Hash值】和【Salt值】;* * 3.系统将【Salt值】和【用户输入的密码】连接到一起;* * 4. 对连接后的值进行散列,得到【Hash值2】(注意是即时运算出来的值);** 5.比较【Hash值1】和【Hash值2】是否相等,相等则表示密码正确,否则表示密码错误。*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {// 模拟从数据库查询出来的数据String username = "张三";// 存储在数据库中不再是明文密码,而是经过md5+slat之后的密文String hasdcrential = "4166a9a6e14420ef718f9b59d4adc0fb";// 1.根据token取出用户提交的信息UsernamePasswordToken user_token = (UsernamePasswordToken) token;// 2.判断用户名是否与数据库内的匹配if (!user_token.getUsername().equals(username)) {throw new UnknownAccountException("无此用户");}// 3.将用户的信息提交// 参数1 是用户的身份// 参数2 从数据库取出的经过md5和slat加工之后的密码// 参数3 你的slat// 参数4 当前realm的nameSimpleAuthenticationInfo info = new SimpleAuthenticationInfo(user_token.getPrincipal(), hasdcrential,ByteSource.Util.bytes(slat), this.getName());return info;}}

2,验证

public class TestAuthentication03 {// 使用hash加密的次数static final int hashInterations = 1024;public static void main(String[] args) {// 创建安全管理器DefaultSecurityManager securityMananger = new DefaultSecurityManager();// 创建realmMD5AndSaltRealm realm = new MD5AndSaltRealm();// 创建realm使用的hash凭证器HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();// 告诉凭证器加密的类型matcher.setHashAlgorithmName("md5");// 告诉凭证器使用hash散列加密的次数matcher.setHashIterations(1024);// 注入realmrealm.setCredentialsMatcher(matcher);// 给securityMananger注入realmsecurityMananger.setRealm(realm);// 将securityMananger给安全管理工具SecurityUtils.setSecurityManager(securityMananger);// 获取subjectSubject subject = SecurityUtils.getSubject();// 模拟用户提交的数据UsernamePasswordToken token = new UsernamePasswordToken("张三", "123456");try {subject.login(token);System.out.println("登录成功");} catch (Exception e) {e.printStackTrace();}}}

MD5算法与Salt相关推荐

  1. 程序猿必知必会[EP1]MD5算法

    1. 基础信息: MD5算法,全称MD5信息摘要算法(MD5 Message-Digest Algorithm),是一种广泛使用的密码散列函数,可以产生128位 / 16字节的散列值(hash val ...

  2. MD5算法可以破解么?为什么?网上有在线破解是怎么回事?

    答:MD5算法不可以破解. 因为MD5是单向散列函数,输入任意长度的信息,经过处理,输出为128位的信息:不同的输入得到的不同的结果:根据128位的输出结果不可能反推出输入的信息.所以不能从密文(散列 ...

  3. Hash的Md5算法

    做项目的时候,经常会遇到用户登录方面的功能.用户登录,就涉及到账号和密码的问题,在后台数据库中,密码不可能存为明码,也就意味着加密,常见的就是对密码做Hash,或者为了安全起见,也会对密码追加salt ...

  4. [js] MD5算法

    js版md5算法: /** * * MD5 (Message-Digest Algorithm) * http://www.webtoolkit.info/ * **/var MD5 = functi ...

  5. MD5算法之C#程序

    MD5算法比较特别,最适合用汇编语言来写,好多高级语言对之无能无力或效率极低. 比如我最开始尝试用Python和Euphoria编写,发现不太容易.相比而言,C#作为C家簇 中新兴的一门.net语言, ...

  6. T-SQL MD5算法实现

    转自:http://www.cnblogs.com/yeagen/archive/2009/02/08/1386374.html 函数代码: /**************************** ...

  7. MD5算法了解(JAVA实现)

    MD5算法:尽管已经被破解,但任然广泛应用于各个领域中 如文件校验:当我们下载文件时为了保证文件的安全性,我们能够在其站点上找到相应的md5值进行校验,假设md5值不一致,也就是说文件被人动过(一般都 ...

  8. C#的加密解密算法,包括Silverlight的MD5算法

    C#的加密解密算法,包括Silverlight的MD5算法 下面是一段加密解密工具类,其中的WinFormMD5Encrypt方法可以使得Winform和WebForm下的MD5加密结果一致,默认他们 ...

  9. java md5包_JAVA中有没有提供MD5算法的包啊?

    拉莫斯之舞 有,在java.security包的MessageDigest类.例子:import java.security.MessageDigest;public class Test2 {pub ...

最新文章

  1. maven java 配置文件路径_Maven 的配置文件路径读取
  2. multinormalNB多项式朴素贝叶斯原理及代码
  3. 空服务器安装linux,debian服务器linux服务器web建站搭建linux服务器之Debian安装
  4. 如何使用subversion管理iOS源代码
  5. Android搭建web,Android手机搭建WEB环境
  6. 宁德时代,想成为“绿巨人”
  7. FreeRTOS源码分析与应用开发01:中断配置与临界段
  8. 华为的鸿蒙系统和苹果的操作系统有什么区别?
  9. ORA-28002 the password will expire
  10. linux下MySQL密码修改过程记录
  11. QT添加MySQL驱动依赖
  12. 《组织行为学》读后感_20170803
  13. C++ STL map插入效率优化
  14. 《仿大众点评仿美团做一个评价网站——Java SSM》项目研发阶段性总结
  15. 万字带你入门Go语言(建议收藏)
  16. 【操作系统】第二章--进程的描述与控制--笔记与理解(2)
  17. 怎么申报高新?流程是什么??
  18. 计算机桌面怎么全屏显示,如何让电脑显示器屏幕显示全屏
  19. Android 滚动字幕实现
  20. 辉煌一时的金立如今却沦为山寨机?只因做错了这一点

热门文章

  1. Shell中冒号的特殊用法
  2. 提高php性能的介意,ThinkPHP5提升性能的办法_浙江PHP博客
  3. Boss直聘App上“天使投资、VC、PE” 与“A轮、B轮、C轮融资”的关系
  4. 一些小技巧,想起来了就码上!
  5. 步步高创始人段永平的选股规则
  6. 《区块链技术与应用》北大肖臻老师——课程笔记【1-3】
  7. STM32和OV7670的串口上位机调试
  8. 微信发语音,会被上司和客户骂?老外都知道这事儿了
  9. python ocr 文字识别_python:使用 cnocr 进行文字识别
  10. python编程:判断输入的边长能否构成三角形 如果能则计算出三角形的周长和面积