zoukankan      html  css  js  c++  java
  • Java实现 Base64、MD5、MAC、HMAC加密(转)

    开始对那些基本的加密还不怎么熟练,然后总结了些,写了一个测试:支持 Base64、MD5、MAC、HMAC加密,长话短说,我们都比较喜欢自己理解,看代码吧!

    采用的输UTF-8的格式...

    package codec;
    
    import java.security.MessageDigest;
    
    import javax.crypto.KeyGenerator;
    import javax.crypto.Mac;
    import javax.crypto.SecretKey;
    import javax.crypto.spec.SecretKeySpec;
    
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
    
    /**
     * 基础加密组件
     * 
     * @author Visec·Dana
     * @version 1.0
     * @since 1.0
     */
    public abstract class Coder {
        public static final String KEY_SHA = "SHA";
        public static final String KEY_MD5 = "MD5";
    
        /**
         * MAC算法可选以下多种算法
         * 
         * <pre>
         * HmacMD5 
         * HmacSHA1 
         * HmacSHA256 
         * HmacSHA384 
         * HmacSHA512
         * </pre>
         */
        public static final String KEY_MAC = "HmacMD5";
    
        /**
         * BASE64解密
         * 
         * @param key
         * @return
         * @throws Exception
         */
        public static byte[] decryptBASE64(String key) throws Exception {
            return (new BASE64Decoder()).decodeBuffer(key);
        }
    
        /**
         * BASE64加密
         * 
         * @param key
         * @return
         * @throws Exception
         */
        public static String encryptBASE64(byte[] key) throws Exception {
            return (new BASE64Encoder()).encodeBuffer(key);
        }
    
        /**
         * MD5加密
         * 
         * @param data
         * @return
         * @throws Exception
         */
        public static byte[] encryptMD5(byte[] data) throws Exception {
    
            MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
            md5.update(data);
            return md5.digest();
    
        }
    
        /**
         * SHA加密
         * 
         * @param data
         * @return
         * @throws Exception
         */
        public static byte[] encryptSHA(byte[] data) throws Exception {
            MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
            sha.update(data);
            return sha.digest();
    
        }
    
        /**
         * 初始化HMAC密钥
         * 
         * @return
         * @throws Exception
         */
        public static String initMacKey() throws Exception {
            KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
            SecretKey secretKey = keyGenerator.generateKey();
            return encryptBASE64(secretKey.getEncoded());
        }
    
        /**
         * MAC加密
         * 
         * @param data
         * @param key
         * @return
         * @throws Exception
         */
        public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
            SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
            Mac mac = Mac.getInstance(secretKey.getAlgorithm());
            mac.init(secretKey);
            return mac.doFinal(data);
    
        }
    }
    package codec;
    
    import java.math.BigInteger;
    
    public class CoderTest {
        public static void main(String[] args) throws Exception {
            CoderTest.test();
        }
    
        public static void test() throws Exception {
            String inputStr = "这是一些简单的加密测试";
            System.err.println("原文:" + inputStr);
    
            byte[] inputData = inputStr.getBytes();
            String code = Coder.encryptBASE64(inputData);
    
            System.err.println("BASE64加密后:" + code);
    
            byte[] output = Coder.decryptBASE64(code);
    
            String outputStr = new String(output);
    
            System.err.println("BASE64解密后:" + outputStr);
    
            // 单元测试 Junit4[暂时不用...]
            /*
             * // 验证BASE64加密解密一致性 assertEquals(inputStr, outputStr);
             * 
             * // 验证MD5对于同一内容加密是否一致 assertArrayEquals(Coder.encryptMD5(inputData),
             * Coder .encryptMD5(inputData));
             * 
             * // 验证SHA对于同一内容加密是否一致 assertArrayEquals(Coder.encryptSHA(inputData),
             * Coder .encryptSHA(inputData));
             * 
             * String key = Coder.initMacKey(); System.err.println("Mac密钥:/n" +
             * key);
             * 
             * // 验证HMAC对于同一内容,同一密钥加密是否一致
             * assertArrayEquals(Coder.encryptHMAC(inputData, key),
             * Coder.encryptHMAC( inputData, key));
             */
            BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));
            System.err.println("MD5:" + md5.toString(16));
    
            BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));
            System.err.println("SHA:" + sha.toString(32));
    
            BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));
            System.err.println("HMAC:" + mac.toString(16));
        }
    }

    Output:

    原文:这是一些简单的加密测试
    BASE64加密后:6L+Z5piv5LiA5Lqb566A5Y2V55qE5Yqg5a+G5rWL6K+V
    
    BASE64解密后:这是一些简单的加密测试
    MD5:76757e30d128e82b14488b115794d959
    SHA:6f7afslor1oev1k7k40um57cscuqkjtn
    HMAC:782313e944a28a55fc20507e50a9d470
  • 相关阅读:
    2020前端学习路线 之完结篇
    axios 请求超时,设置重新请求的完美解决方法
    如何终止前端发起的请求?
    轮询与长轮询
    最全React技术栈技术资料汇总(收藏)
    React 服务端渲染完美的解决方案
    将数组格式的字符串转换成数组
    Cannot read property 'map' of undefined
    计算机编码方式简介
    python01之文件处理
  • 原文地址:https://www.cnblogs.com/softidea/p/4626089.html
Copyright © 2011-2022 走看看