AnthonyZero's Bolg

Java实现简单加密算法

概要

本篇内容简要介绍BASE64、MD5、SHA、HMAC几种加密算法.BASE64编码算法不算是真正的加密算法。MD5、SHA、HMAC这三种消息摘要算法,可谓是非可逆加密,就是不可解密的加密方法(单向)。

  • BASE64 严格地说,属于编码格式,而非加密算法
  • MD5(Message Digest algorithm 5,信息摘要算法)
  • SHA(Secure Hash Algorithm,安全散列算法)
  • HMAC(Hash Message Authentication Code,散列消息鉴别码)

消息摘要算法用于数据校验、对称加密算法用于数据加密、非对称加密算法用于密钥交换、数字签名算法用于身份验证等等。

BASE64

/**
 * @Title: encryptBASE64
 * @Description: Base64加密 用Commons Codec实现
 * @param key
 * @return String
 */
public static String encryptBASE64(byte[] key) {
    byte[] data = Base64.encodeBase64(key);
    return new String(data);
}

/**
 * @Title: decryptBASE64
 * @Description: Base64解密 用Commons Codec实现
 * @param key
 * @return byte[]
 */
public static byte[] decryptBASE64(String key) {
    return Base64.decodeBase64(key);
}

MD5

  /**
 * @Title: encryptMD5
 * @Description: MD5加密 JDK实现
 * @param data
 * @return String
 * @throws Exception
 */
public static String encryptMD5(byte[] data) throws Exception {
    MessageDigest md5 = MessageDigest.getInstance("MD5");
    byte[] value = md5.digest(data);
    return Hex.encodeHexString(value);
}

/**
 * @Title: encryptMD5Hex
 * @Description: MD5加密 用Commons Codec实现
 * @param data
 * @return String
 * @throws Exception
 */
public static String encryptMD5Hex(byte[] data) throws Exception {
    return DigestUtils.md5Hex(data);
}

SHA

/**
 * @Title: encodeSHA
 * @Description: SHA加密 JDK实现
 * @param data
 * @return String
 * @throws Exception
 */
public static String encryptSHA(byte[] data) throws Exception {
    MessageDigest md5 = MessageDigest.getInstance("SHA");
    byte[] value = md5.digest(data);
    return Hex.encodeHexString(value);
}

/**
 * @Title: encodeSHAHex
 * @Description: SHA加密 用Commons Codec实现
 * @param data
 * @return String
 * @throws Exception
 */
public static String encryptSHAHex(byte[] data) throws Exception {
    return DigestUtils.sha1Hex(data);
}

HMAC

/**
 * @Title: initHMacMD5Key
 * @Description: 初始化HMacMD5密钥
 * @return byte[]
 * @throws Exception
 */
public static byte[] initHMacMD5Key() throws Exception {
    // 初始化KeyGenerator
    KeyGenerator keyGenerator = KeyGenerator.getInstance("HMacMD5");
    // 产生密钥
    SecretKey secretKey = keyGenerator.generateKey();
    // 获取密钥
    return secretKey.getEncoded();
}

/**
 * @Title: encryptHMacMD5
 * @Description: HMacMD5消息摘要 JDK实现
 * @param data 待做摘要处理的数据
 * @param key 密钥
 * @return String
 * @throws Exception
 */
public String encryptHMacMD5(byte[] data, byte[] key) throws Exception {
    // 还原密钥
    SecretKey secretKey = new SecretKeySpec(key, "HMacMD5");
    // 实例化Mac
    Mac mac = Mac.getInstance(secretKey.getAlgorithm());
    // 初始化Mac
    mac.init(secretKey);
    // 执行消息摘要
    return Hex.encodeHexString(mac.doFinal(data));
}

为了弥补Java在加密解密算法API的不足,例如第三方开源组件Bouncy Castle和Apache Commons Codec是个不错的选择

附录