• Java MD5 加密加强版


    .

    .

    .

    .

    .

    花了一个多小时的时间整理了原来一直使用的 MD5 加密类,这次新添加了 Salt 二次 MD5 加密模块。

    核心的方法 cell32() 是很久以前在网上找来的,因为不记得原作者和出处了,所以没有贴出来版权,如果您是该方法的作者,请联系我,我将会及时附上版权。

    由于本人水平有限,如果各位有更好的算法还请多多指教。

    以下是完整代码:

      1 package cn.lastcc.publicTools;
    2
    3 import java.security.MessageDigest;
    4 import java.security.NoSuchAlgorithmException;
    5
    6 /**
    7 * Salt MD5 加强模块<br>
    8 * 提供 16 位与 32 位 MD5 加密与其 Salt 加密功能<p>
    9 *
    10 * Salt 加密方法调用:<br>
    11 * MD5 md5 = new MD5();<br>
    12 * String [] _tmp = md5.salt32("明文"); <br>
    13 System.out.println(_tmp[0] + "\t" + _tmp[1]);
    14 *
    15 * @author Programer.Monkey<br>
    16 * Email: Programer.Monkey@gmail.com
    17 *
    18 * @version 11.12.30.1
    19 *
    20 */
    21 public class MD5 {
    22
    23 /**
    24 * 随机密钥长度
    25 */
    26 private static final int _KEYTLENGTH = 6;
    27
    28 public MD5() {
    29 }
    30
    31 /**
    32 * 生成随机密钥
    33 *
    34 * @param length
    35 * 密钥长度
    36 */
    37 private String getRandomKeyt(int length) throws Exception {
    38 if (length < 1)
    39 throw new Exception("密钥长度不能小于 1");
    40 String _keyt = "";
    41 for (int i = 0; i < length; i++) {
    42 _keyt += (char) (33 + (int) (Math.random() * (126 - 33 + 1)));
    43 }
    44 return _keyt;
    45 }
    46
    47 /**
    48 * 32位标准 MD5 加密
    49 *
    50 * @param plainText
    51 * 明文
    52 * @return 密文<br>
    53 * 返回 Null 值则出现异常
    54 */
    55 public String cell32(String plainText) {
    56 try {
    57 MessageDigest md = MessageDigest.getInstance("MD5");
    58 md.update(plainText.getBytes());
    59 byte b[] = md.digest();
    60 int i;
    61 StringBuffer buf = new StringBuffer("");
    62 for (int offset = 0; offset < b.length; offset++) {
    63 i = b[offset];
    64 if (i < 0)
    65 i += 256;
    66 if (i < 16)
    67 buf.append("0");
    68 buf.append(Integer.toHexString(i));
    69 }
    70 return buf.toString();// 32位的加密
    71
    72 } catch (NoSuchAlgorithmException e) {
    73 e.printStackTrace();
    74 }
    75 return null;
    76 }
    77
    78 /**
    79 * 32 位 salt 加密
    80 *
    81 * @param plainText
    82 * 明文
    83 * @return 索引 0 是密文,索引 1 是二次密钥
    84 */
    85 public String[] salt32(String plainText) throws Exception {
    86 return salt("cell32", plainText);
    87 }
    88
    89 /**
    90 * 16 位标准 MD5 加密
    91 *
    92 * @param plainText
    93 * 明文
    94 * @return 密文<br>
    95 * 返回 Null 值则出现异常
    96 */
    97 public String cell16(String plainText) {
    98 String result = cell32(plainText);
    99 if (result == null)
    100 return null;
    101 return result.toString().substring(8, 24);// 16位的加密
    102 }
    103
    104 /**
    105 * 16 位 salt 加密
    106 *
    107 * @param plainText
    108 * 明文
    109 * @return 索引 0 是密文,索引 1 是二次密钥
    110 */
    111 public String[] salt16(String plainText) throws Exception {
    112 return salt("cell16", plainText);
    113 }
    114
    115 /**
    116 * 根据调用的方法名称执行不同的方法
    117 *
    118 * @param saltFunctionName
    119 * 加密的方法名称
    120 */
    121 private String[] salt(String saltFunctionName, String plainText)
    122 throws Exception {
    123 String _keyt = getRandomKeyt(_KEYTLENGTH);
    124 return new String[] {(String) this.getClass().getMethod(saltFunctionName, Class.forName("java.lang.String")).invoke(this, (cell32(plainText) + _keyt)), _keyt };
    125 }
    126 }



    以下是调用 Salt 算法的方法:

    1 String [] tmp = ((MD5)Class.forName("cn.lastcc.publicTools.MD5").newInstance()).salt32("abcdef");




  • 相关阅读:
    Android插件化技术简介
    Fragment回退栈&commit()和commitAllowingStateLoss()
    Android热更新技术——Tinker、nuwa、AndFix、Dexposed
    Object的wait/notify/notifyAll&&Thread的sleep/yield/join/holdsLock
    synchronized与Lock的区别与使用
    多分类Logistics回归公式的梯度上升推导&极大似然证明sigmoid函数的由来
    从损失函数的角度详解常见机器学习算法
    LR的损失函数&为何使用-log损失函数而非平方损失函数
    css Cascading Style Sheet 层叠样式表
    前端—— 前端介绍开始(二)
  • 原文地址:https://www.cnblogs.com/0xcafebabe/p/2307966.html
Copyright © 2020-2023  润新知