• 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
  • 相关阅读:
    winform程序,备份数据库+并压缩+并删除以前的备份
    冒泡排序
    存储过程和SQL语句比较
    简单的firebird插入速度测试
    [收藏转]由于CredSSP加密Oracle修正 导致远程桌面报错处理
    由Handle转换为控件
    字符串格式化
    查询mssql的死锁语句
    读取和修改app.config文件
    json序列化与反序列化
  • 原文地址:https://www.cnblogs.com/softidea/p/4626089.html
Copyright © 2020-2023  润新知