您的位置 首页 java

职场干货!使用MD5技术配置加密指南

使用 java 的MessageDigest实现 MD5 加密算法

  • MD5加密算法的实现原理
  • MessageDigest类
      • update
      • reset
      • digest
      • isEqual
      • getInstance
  • 字符串的MD5加密算法
  • 文本的MD5加密工具类

MD5加密算法的实现原理

  • Java中MD5加密算法的实现:
 public class MD5 {
// 全局数组
 private  final  static  String[] strDigit = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"};

public class MD5 {
}

// 返回形式为数字和 字符串 
private static String  byte ToArrayString(byte bByte) {
int iRet = bByte;
if (iRet < 0) {
iRet += 256;
}
int iD1 = iRet / 16;
int iD2 = iRet % 16;
return strDigits[iD1] + strDigits[iD2];
}

// 返回形式只为数字
private static String byteToNum(byte bByte) {
int iRet = bByte;
if (iRet < 0) {
iRet += 256;
}
return String.valueOf(iRet);
}

// 将字节数组转换成为16 进制 的字符串
private static String byteToString(byte[] bByte) {
 StringBuffer  stringBuffer = new StringBuffer();
for (int i; i < bByte.length; i++) {
 stringBuffer .append(byteToArrayString(bByte[i]));
}
return stringBuffer.toString();
}

// 获取MD5值
public static String GetMD5Code(String strObj) {
String resultString = null;
try {
resultString = new String();
MessageDigest md5 = MessageDigest.getInstance("MD5");
// md5.digest() - 返回值为存放Hash值结果的byte数组
resultString = byteToString(md5.digest(strObj.getBytes()));
} catch (NoSuchAlgorithm Exception  e) {
e.printStackTrace();
}
return resultString;
}
} 
  

MessageDigest类

  • MessageDigest类: 为应用程序提供信息摘要算法的功能.比如MD5算法和 SHA 算法信息摘要是安全的单向 Hash 函数 : 接收任意大小的数据,并输出固定长度的Hash值

update

  • MessageDigest对象在开始时会被初始化
  • 对象通过调用 update() 方法处理数据
 /**
 * 使用指定的byte数组更新摘要
 *
 * @param input 指定的byte数组
 */public  void  update(byte[] input);
  

reset

  • 任何时候都可以调用 reset() 方法重置摘要

digest

  • 一旦所需要更新的数据都已经被更新后,应该调用 digest() 方法完成Hash计算
  • 对于给定数量的更新数据 ,digest() 方法只能被调用一次.再调用 digest() 方法之后,MessageDigest对象被重新设置成初始状态
 /**
 * 通过执行诸如填充之类的最终操作完成Hash计算. 
 * 在调用此方法之后,摘要被重置
 *
 * @return byte[] Hash计算后的byte数组
 */public byte[] digest();
  

isEqual

 /**
 * 比较两个摘要的相等性.做简单的字节比较
 *
 * @param digestA 比较的摘要字节数组A
 * @param digestB 比较的摘要字节数组B
 * @return boolean 是否相等
 */public static boolean isEqual(byte[] digestA, byte[] digestB);
  

getInstance

  • 返回实现指定摘要算法的 MessageDigest 对象
 /**
 * 返回实现指定摘要算法的MessageDigest对象
 *
 * @param algorithm 请求的算法的名称
 * @param provider 提供者名称
 * @return MessageDigest 指定摘要算法的MessageDigest对象
 * @throws NoSuchAlgorithmException 当指定的请求算法名称不存在时抛出异常
 */public static MessageDigest getInstance(String algorithm) throws NoSuchAlgorithmException; 

/**
 * 返回实现指定摘要算法的MessageDigest对象
 *
 * @param algorithm 请求算法的名称
 * @return MessageDigest 指定摘要算法的MessageDigest对象
 * @throws NoSuchAlgorithmException 当指定的请求算法名称不存在时抛出异常
 */public static MessageDigest getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException;
  
  • Provider 可以通过 java.security.Security getProviders() 方法获得已注册的提供者列表
  • SUN 提供的常用的算法:
    • MD2
    • MD5
    • SHA-1
    • SHA-256
    • SHA-384
    • SHA-512

字符串的MD5加密算法

  • 使用Java自带的 MessageDigest 实现对文本的MD5加密算法:
 /**
 * 将字符串转换为MD5
 */ public class ParseMD5 {
 public static String parseStrToMd5L32(String str) {
 // 将字符串转换为32位小写MD5 
 String reStr = null;
 try {
 MessageDigest md5 = MessageDigest.getInstance("MD5");
 byte[] bytes = md5.digest(str.getBytes());
 StringBuffer stringBuffer = new StringBuffer();
 for (byte b : bytes) {
 int bt = b&0xff;
 if (bt < 16) {
 stringBuffer.append(0);
 }
 stringBuffer.append(Integer.toHexString(bt));
 }
 reStr = stringBuffer.toString();
 } catch (NoSuchAlgorithmException e) {
 e.printStackTrace();
 }
 return reStr;
 }

// 将字符串转换为32位大写的MD5
public static String parseStrToMd5U32(String str) {
String reStr = parseStrToMd5L32(str);
if (reStr != null) {
reStr = reStr.toUpperCase();
}
return resStr;
}

// 将字符串转换为16位小写的MD5
public static String parseStrToMd5L16(String str) {
String reStr = paseStrToMd5L32(str);
if (reStr != null) {
reStr = reStr.subString(8, 24);
}
return reStr;
}

// 将字符串转换为16位大写的MD5
public static String parseStrToMd5U16(String str) {
String reStr = parseStrToMd5L32(str);
if (reStr != null) {
reStr = reStr.toUpperCase().subString(8, 24);
}
return reStr;
}
 }
  

文本的MD5加密工具类

  • Java中提供了自带的 MessageDigest 实现对文本的加密算法. 对文本进行加密的MD5加密工具类如下:
 public class MD5Util {
// 将文本转换为32位小写的MD5
public static String textToMd5L32(String plainText) {
String result = null;
// 判断需要转换的文本是否为空
if (StringUtils.isBlank(plainText)) {
return null;
}
try {
// 进行实例化和初始化
MessageDigest md5 = MessageDigest.getInstance("MD5");
// 得到一个操作系统默认的字节编码格式的字节数组
byte[] byteInput = plainText.getBytes();
// 对得到的字节数组进行处理
md5.update(byteInput);
// 进行Hash计算并得到返回结果
byte[] btResult = md5.digest();
// 得到进行Hash计算后数据的长度
StringBuffer stringBuffer = new StringBuffer();
for (byte b : btResult) {
int bt = b&0xff;
if (bt < 16) {
stringBuffer.append(0);
}
stringBuffer.append(Integer.toHexString(bt));
}
reStr = stringBuffer.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return reStr;
}

// 将文本转换为32位大写的MD5
public static String textToMd5U32(String plainText) {
if (StringUtils.isBlank(plainText)) {
return null;
}
String result = textToMd5L32(plainText);
result = result.toUpperCase();
return result;
}
}  

文章来源:智云一二三科技

文章标题:职场干货!使用MD5技术配置加密指南

文章地址:https://www.zhihuclub.com/185658.shtml

关于作者: 智云科技

热门文章

网站地图