MD5加盐算法(JAVA)

声明:

下面算法是网上看到的,自己做记录用,每个用户随机不同盐值,生成48位密码。

算法描述:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. import java.security.MessageDigest;  
  2. import java.util.Random;  
  3.   
  4. import org.apache.commons.codec.binary.Hex;  
  5.   
  6. public class PasswordUtil {  
  7.     /** 
  8.      * 生成含有随机盐的密码 
  9.      */  
  10.     public static String generate(String password) {  
  11.         Random r = new Random();  
  12.         StringBuilder sb = new StringBuilder(16);  
  13.         sb.append(r.nextInt(99999999)).append(r.nextInt(99999999));  
  14.         int len = sb.length();  
  15.         if (len < 16) {  
  16.             for (int i = 0; i < 16 - len; i++) {  
  17.                 sb.append("0");  
  18.             }  
  19.         }  
  20.         String salt = sb.toString();  
  21.         password = md5Hex(password + salt);  
  22.         char[] cs = new char[48];  
  23.         for (int i = 0; i < 48; i += 3) {  
  24.             cs[i] = password.charAt(i / 3 * 2);  
  25.             char c = salt.charAt(i / 3);  
  26.             cs[i + 1] = c;  
  27.             cs[i + 2] = password.charAt(i / 3 * 2 + 1);  
  28.         }  
  29.         return new String(cs);  
  30.     }  
  31.   
  32.     /** 
  33.      * 校验密码是否正确 
  34.      */  
  35.     public static boolean verify(String password, String md5) {  
  36.         char[] cs1 = new char[32];  
  37.         char[] cs2 = new char[16];  
  38.         for (int i = 0; i < 48; i += 3) {  
  39.             cs1[i / 3 * 2] = md5.charAt(i);  
  40.             cs1[i / 3 * 2 + 1] = md5.charAt(i + 2);  
  41.             cs2[i / 3] = md5.charAt(i + 1);  
  42.         }  
  43.         String salt = new String(cs2);  
  44.         return md5Hex(password + salt).equals(new String(cs1));  
  45.     }  
  46.   
  47.     /** 
  48.      * 获取十六进制字符串形式的MD5摘要 
  49.      */  
  50.     public static String md5Hex(String src) {  
  51.         try {  
  52.             MessageDigest md5 = MessageDigest.getInstance("MD5");  
  53.             byte[] bs = md5.digest(src.getBytes());  
  54.             return new String(new Hex().encode(bs));  
  55.         } catch (Exception e) {  
  56.             return null;  
  57.         }  
  58.     }  
  59.   
  60.     public static void main(String[] args) {  
  61.         String password = generate("admin");  
  62.         System.out.println(verify("admin", password));  
  63.     }  
  64. }  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值