软件设计 2017-07-20
一、主要使用MessageDigest类(java.security包下)
1、首先,先看下官方文档
2、接下来看几个MessageDigest的方法(按照使用顺序介绍)
public static MessageDigestgetInstance(String algorithm)
                                 throws NoSuchAlgorithmException 返回实现指定摘要算法的 MessageDigest 对象。参数algorithm为加密方式,可选MD5、sha...public byte[] digest()通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置返回:存放哈希值结果的 byte 数组。
3、将字节数组转换成16进制字符串
为什么要将字节数组转换成16进制字符串?
我们使用digest()方法获得MessageDigest生成的摘要后需要将其转换成String字符串
Java中无论是汉字还是英文字母都是用Unicode编码来表示的,一个Unicode码是16位,每字节是8位,所以一个Unicode码占两字节。
但是英文字母比较特殊,源自于8位(1字节)的ASCII码,于是在Unicode码仅使用了低8位(1字节)就可以表示,高8位的话不使用也无所谓。
代码如下:
String str = "lalalla";
        byte[] resultByteArray;
        try {
            //获取MessageDigest对象
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            messageDigest.update(str.getBytes());
            resultByteArray = messageDigest.digest();
            for(Byte content:resultByteArray){
                System.out.println(content);
            }
            System.out.println(bytesToHexFun2(resultByteArray));
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }  二、byte[]转十六进制String(转载自:http://blog.csdn.net/worm0527/article/details/69939307)
所谓十六进制String,就是字符串里面的字符都是十六进制形式,因为一个byte是八位,可以用两个十六进制位来表示,因此,byte数组中的每个元素可以转换为两个十六进制形式的char,所以最终的HexString的长度是byte数组长度的两倍
private static final char[] HEX_CHAR = {'0', '1', '2', '3', '4', '5', 
            '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};/**
     * 方法二:
     * byte[] to hex string
     * 
     * @param bytes
     * @return
     */
    public static String bytesToHexFun2(byte[] bytes) {
        char[] buf = new char[bytes.length * 2];
        int index = 0;
        for(byte b : bytes) { // 利用位运算进行转换
            buf[index++] = HEX_CHAR[b >>> 4 & 0xf];//高四位
            buf[index++] = HEX_CHAR[b & 0xf];//低四位
        }
        return new String(buf);
    } 如果是使用MD5得到的摘要进行转换,那么得到的字符串为32位(因为MD5得到的摘要的字节数组的长度为16),这样我们利用二中byte[]转十六进制String的方法将一中生成的字节数组进行转换,即得到我们需要的String类型的MD5加密字符串。