看到之前项目中,关于MD5加密的足足写了一个辅助类,看的都不爽。

其实在Java中大部分都帮你实现好了,完成MD5加密,三行代码足矣:

/**
 * 对字符串md5加密
 *
 * @param str
 * @return
 */
public static String getMD5(String str) {
    try {
        // 生成一个MD5加密计算摘要
        MessageDigest md = MessageDigest.getInstance("MD5");
        // 计算md5函数
        md.update(str.getBytes());
        // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
        // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
        return new BigInteger(1, md.digest()).toString(16);
    } catch (Exception e) {
        throw new SpeedException("MD5加密出现错误");
    }
}
你可能感兴趣的内容
1条评论
1242380113 1年前

这里有个大坑:(转载自http://webcache.googleusercontent.com/search?q=cache:VmYqeTCPMSwJ:darren.ink/archives/79+&cd=12&hl=zh-CN&ct=clnk)PS:在使用过程中发现还是会有问题,因为是转BigInteger然后输出16进制的字符串,所以导致一定情况下前导的0会丢失,如用上面的代码MD5加密字母a,会发现和其他地方的MD5加密,前面缺少0。

最后还是建议自己手动将byte数组转16进制的字符串的方法:

byte[] hash = md.digest(); StringBuilder secpwd = new StringBuilder(); for (int i = 0; i < hash.length; i++) { int v = hash[i] & 0xFF; if (v < 16) secpwd.append(0); secpwd.append(Integer.toString(v, 16)); } return secpwd.toString();

selfly

交流QQ群:32261424
Owner