Java 专栏

Java 常用加密算法(一)---单向加密算法(MD5/SHA)

2017-08-27  本文已影响39人  _凌浩雨

Java 常用加密算法(一)---单向加密算法(MD5/SHA)

  1. MD5加密

    MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
    在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N512+448,N为一个非负整数,N可以是零。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,信息的位长=N512+448+64=(N+1)*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。

/**
 * MD5 加密工具类
 * @author mazaiting
 */
public class Md5Util {
    
    /**
     * MD5 加密 生成32位MD5码
     * @param source 需要加密的字符串
     * @return 32位MD5码
     */
    public static String encode(String source) {
        try {
            // 获得MD5 消息摘要
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            // 获得指定编码的字节数据
            byte[] sourceBytes = source.getBytes("UTF-8");
            // 指定的字节数组对摘要执行最终更新
            byte[] digestBytes = messageDigest.digest(sourceBytes);
            StringBuffer hexValue = new StringBuffer();
            
            for (int i = 0; i < digestBytes.length; i++) {
                int val = (digestBytes[i] & 0xff);
                if (val < 16){
                    hexValue.append("0");
                }
                hexValue.append(Integer.toHexString(val));
            }
            
            return hexValue.toString(); 
        } catch (NoSuchAlgorithmException e) {
            return null;// 获得MD5 消息摘要异常
        } catch (UnsupportedEncodingException e) {
            return null;// 获得指定编码的字节数据异常
        }       
    }
    
}
  1. SHA
    SHA是一种数据加密算法,该算法经过加密专家多年来的发展和改进已日益完善,现在已成为公认的最安全的散列算法之一,并被广泛使用。该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。散列函数值可以说是对明文的一种“指纹”或是“摘要”所以对散列值的数字签名就可以视为对此明文的数字签名。
    安全散列算法SHA(Secure Hash Algorithm,SHA)是美国国家标准技术研究所发布的国家标准FIPS PUB 180,最新的标准已经于2008年更新到FIPS PUB 180-3。其中规定了SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512这几种单向散列算法。SHA-1,SHA-224和SHA-256适用于长度不超过264二进制位的消息。SHA-384和SHA-512适用于长度不超过2128二进制位的消息。

/**
 * 采用SHA 加密
 * @author mazaiting
 */
public class SHAUtil {
    /**
     * SHA 加密 生成40位SHA码
     * @param source 待加密字符串
     * @return 返回40位SHA码
     */
    public static String encode(String source) {
        try {
            // 获取SHA的消息摘要
            MessageDigest messageDigest = MessageDigest.getInstance("SHA");
            // 获取指定编码的字符串字节数组
            byte[] sourceBytes = source.getBytes("UTF-8");
            // 对指定字节数据进行更新
            byte[] digestBytes = messageDigest.digest(sourceBytes);
                
            StringBuffer hexValue = new StringBuffer();
            for (int i = 0; i < digestBytes.length; i++) {
                int val = (digestBytes[i] & 0xff);
                if (val < 16) {
                    hexValue.append("0");
                }
                hexValue.append(Integer.toHexString(val));
            }
            
            return hexValue.toString();
        } catch (NoSuchAlgorithmException e) {
            return null;// 获取SHA的消息摘要异常
        } catch (UnsupportedEncodingException e) {
            return null;// 获取指定编码的字符串字节数组失败
        }       
    }
}

代码下载

上一篇下一篇

猜你喜欢

热点阅读