1. public class Test3 {
  2.  
  3. /**
  4. * 生成含有随机盐的密码
  5. */
  6. public static String generate(String password) {
  7. Random r = new Random();
  8. StringBuilder sb = new StringBuilder(16);
  9. sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));
  10. int len = sb.length();
  11. if (len < 16) {
  12. for (int i = 0; i < 16 - len; i++) {
  13. sb.append("0");
  14. }
  15. }
  16. String salt = sb.toString();
  17. password = md5Hex(password + salt);
  18. char[] cs = new char[48];
  19. for (int i = 0; i < 48; i += 3) {
  20. //取MD5后密文的第一位
  21. cs[i] = password.charAt(i / 3 * 2);
  22.  
  23. //取盐值的第一位
  24. char c = salt.charAt(i / 3);
  25. cs[i + 1] = c;
  26.  
  27. //取MD5后密文的第二位
  28. cs[i + 2] = password.charAt(i / 3 * 2 + 1);
  29. }
  30.  
  31. //生成的密文包括MD5的密文和盐值,顺序为一位密文,一位盐值,一位密文
  32. return new String(cs);
  33. }
  34.  
  35. /**
  36. * 校验密码是否正确
  37. */
  38. public static boolean verify(String password, String md5) {
  39. char[] cs1 = new char[32];
  40. char[] cs2 = new char[16];
  41. for (int i = 0; i < 48; i += 3) {
  42. cs1[i / 3 * 2] = md5.charAt(i);
  43. cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);
  44. cs2[i / 3] = md5.charAt(i + 1);
  45. }
  46. String salt = new String(cs2);
  47. return md5Hex(password + salt).equals(new String(cs1));
  48. }
  49.  
  50. /**
  51. * 获取十六进制字符串形式的MD5摘要
  52. */
  53. public static String md5Hex(String src) {
  54. try {
  55. MessageDigest md5 = MessageDigest.getInstance("MD5");
  56. byte[] bs = md5.digest(src.getBytes());
  57. return new String(new Hex().encode(bs));
  58. } catch (Exception e) {
  59. return null;
  60. }
  61. }
  62.  
  63. public static void main(String[] args) {
  64. String password = generate("admin");
  65. System.out.println(password);
  66. System.out.println(verify("admin", password));
  67. }

MD5随机盐值生成法的更多相关文章

  1. 给MD5加上salt随机盐值加密算法实现密码安全的php实现

    给MD5加上salt随机盐值加密算法实现密码安全的php实现 如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码.加上sal ...

  2. c# MD5及盐值加密

    using System;using System.Collections.Generic;using System.Linq;using System.Security.Cryptography;u ...

  3. nodejs进阶:密码加盐:随机盐值

    demo var crypto = require('crypto'); function getRandomSalt(){ return Math.random().toString().slice ...

  4. 用户角色权限查询添加bug集锦 用户密码加密 MD5 加盐 随机盐 spring的加密bcrypt

    package cn.itcast.encode; import org.apache.commons.lang3.RandomStringUtils; import org.springframew ...

  5. 一个密码经过多次MD5加密能否提高安全性?Java MD5盐值加解密

    什么是MD5? MD5(Message Digest Algorithm 5,信息摘要算法5),是计算机广泛使用的摘要算法(又称哈希算法)之一.MD5是将一段信息,通过其不可逆的字符串变换算法,产生了 ...

  6. MD5加盐 Java加密算法

    MD5带盐值的java加密算法   import java.security.MessageDigest; public class PasswordEncoder { private final s ...

  7. (转)浅谈MD5加密算法中的加盐值(SALT)

    我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散列值字典(例如MD5密码破解网站),得到某用户的密码. 加Salt可以一定程度上解决这一问题.所谓加Salt方法,就 ...

  8. Web应用你加盐了吗?——浅谈MD5加密算法中的加盐值(SALT)

    转自:http://blog.csdn.net/blade2001/article/details/6341078 我们知道,如果直接对密码进行散列,那么黑客可以对通过获得这个密码散列值,然后通过查散 ...

  9. MD5加密算法中的加盐值 ,和彩虹表攻击 防止彩虹表撞库

    一.什么是彩虹表? 彩虹表(Rainbow Tables)就是一个庞大的.针对各种可能的字母组合预先计算好的哈希值的集合,不一定是针对MD5算法的,各种算法的都有,有了它可以快速的破解各类密码.越是复 ...

随机推荐

  1. java 继承多态的一些理解和不理解

    1.向上转型的一个误区 一直以为Child 继承Parent以后, Parent p = new Child();  p可以调用Child类中拓展Parent的方法,原来必须在强制转换成Child类才 ...

  2. 什么是SSH

    SSH不仅实现了视图.控制器与模型的彻底分离,而且还实现了业务逻辑层与持久层的分离,耦合度降低,系统的灵活性更好,可复用性高 官方的说法:SSH是 struts+spring+hibernate的一个 ...

  3. Spring与SpringMVC的关系

    在此鉴于你已经了解过Spring的相关知识,简单描述一下Spring与Spring的关系 在框架的使用中,Spring类似于一个具有多种特性,也可以说是多种功能模块的应用平台,(特性就比如IoC,AO ...

  4. iOS开发之工具篇-20个可以帮你简化移动app开发流程的工具

    如果想进入移动app开发这个领域,你总能从别的开发者或者网上或者书上找到各种各样的方法和工具,对于新手来说,还没有摸清门路就已经陷入迷茫了.这里推荐20个可以帮你简化app开发流程的工具.很多开发者都 ...

  5. CodeForces 616A(水题)

    while(t--) 最后结果t=-1 #include <iostream> #include <string> #include <cstring> #incl ...

  6. UOJ#55. 【WC2014】紫荆花之恋

    传送门 暴力思路就是每次点分治计算答案 点分治之后,条件可以变成 \(dis_i-r_i\le r_j-dis_j\) 每次只要查找 \(r_j-dis_j\) 的排名然后插入 \(dis_j-r_j ...

  7. Web前端面试指导(十六):为什么要初始化CSS样式?

    题目点评 这个题目乍一看感觉怪怪的,什么叫初始化样式了?如果换一句话你可能就理解了,就是通用样式.这道题目主要涉及的是理论方面的知识,不用写代码,只要描述清楚就可以了 初始化样式的原因 因为浏览器的兼 ...

  8. is_array判断是否为数组

    if(is_array($arr)){ echo "是数组"; }else{ echo "不是数组"; }

  9. MySQL 备份恢复(导入导出)单个 innodb表

    MySQL 备份恢复单个innodb表呢,对于这种恢复我们我们很多朋友都不怎么了解了,下面一起来看一篇关于MySQL 备份恢复单个innodb表的教程 在实际环境中,时不时需要备份恢复单个或多个表(注 ...

  10. MySQL中有关char、varchar、int、tinyint、decimal

    char.varchar属于字符串类型 1.char属于定长,能确切的知道列值的长度,也就是有多少个字符.当指定char(5)时,表示只能存5个字符,如5个英文‘a’,5个汉字‘我’,5个符号‘&am ...