找到一个开源的MD5加密工具代码,收藏起来

/**
* MD5加密工具
*/
public class MD5Utils { /**
* byte[]字节数组 转换成 十六进制字符串
* @param arr 要转换的byte[]字节数组
* @return String 返回十六进制字符串
*/
private static String hex(byte[] arr) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < arr.length; ++i) {
sb.append(Integer.toHexString((arr[i] & 0xFF) | 0x100).substring(1, 3));
}
return sb.toString();
} /**
* MD5加密,并把结果由字节数组转换成十六进制字符串
* @param str 要加密的内容
* @return String 返回加密后的十六进制字符串
*/
private static String md5Hex(String str) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(str.getBytes());
return hex(digest);
} catch (Exception e) {
e.printStackTrace();
}
return "";
} /**
* 生成含有随机盐的密码
* @param password 要加密的密码
* @return String 含有随机盐的密码
*/
public static String getSaltMD5(String password) {
// 生成一个16位的随机数
Random random = new Random();
StringBuilder sBuilder = new StringBuilder(16);
sBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999));
int len = sBuilder.length();
if (len < 16) {
for (int i = 0; i < 16 - len; i++) {
sBuilder.append("0");
}
}
// 生成最终的加密盐
String salt = sBuilder.toString();
password = md5Hex(password + salt);
char[] cs = new char[48];
for (int i = 0; i < 48; i += 3) {
cs[i] = password.charAt(i / 3 * 2);
char c = salt.charAt(i / 3);
cs[i + 1] = c;
cs[i + 2] = password.charAt(i / 3 * 2 + 1);
}
return String.valueOf(cs);
} /**
* 验证加盐后是否和原密码一致
* @param password 原密码
* @param password 加密之后的密码
* @return boolean true表示和原密码一致 false表示和原密码不一致
*/
public static boolean getSaltverifyMD5(String password, String md5str) {
char[] cs1 = new char[32];
char[] cs2 = new char[16];
for (int i = 0; i < 48; i += 3) {
cs1[i / 3 * 2] = md5str.charAt(i);
cs1[i / 3 * 2 + 1] = md5str.charAt(i + 2);
cs2[i / 3] = md5str.charAt(i + 1);
}
String Salt = new String(cs2);
return md5Hex(password + Salt).equals(String.valueOf(cs1));
} public static void main(String[] args) {
// 原密码
String plaintext = "admin";
// 获取加盐后的MD5值
String ciphertext = MD5Utils.getSaltMD5(plaintext);
System.out.println("加盐后MD5:" + ciphertext);
System.out.println("是否是同一字符串:" + MD5Utils.getSaltverifyMD5(plaintext, ciphertext));
}
}

最新文章

  1. java的基础知识文件操作和标识符
  2. Mongo查询
  3. sql语句常用说明与解析
  4. Web开发学习笔记
  5. spring bean实例化方式
  6. GPS学习
  7. 绑定事件 addEventListener
  8. Cocos2d-x项目移植到WP8小记
  9. ZOJ1524
  10. php 编码规范(1)
  11. (转)将wcf 以webservice的方式调用
  12. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
  13. 使用C#创建简单的WCF服务
  14. Handler学习小结
  15. 瑞芯微RK3188如何配置USB摄像头支持
  16. OCR技术浅析-tesserOCR(3)
  17. 5th,Python购物车模拟
  18. SQL Server 数据库中的几个常见的临界值
  19. iOS 设计模式-委托模式
  20. unity5 Orthographic模式相机视截体尺寸计算

热门文章

  1. Method of offloading iSCSI TCP/IP processing from a host processing unit, and related iSCSI TCP/IP offload engine
  2. WPF中的3D特性和常见的几个类
  3. VC除零异常(错误)捕获
  4. Python缺乏调查的陷阱 动态实例属性、引用、逃生
  5. [Gevent]gevent 网络抓取问答
  6. 通通玩blend美工(2)——时钟
  7. .Net 开源服务 and Net站点
  8. Qt for windows消息循环、libqxt分析和wince快捷键处理
  9. PowerDesigner 在通过jdbc连接数据库时 Could not Initialize JavaVM!
  10. ML:吴恩达 机器学习 课程笔记(Week5~6)