• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    3年前 (2015-07-28)  密码 |   抢沙发  23 
    文章评分 0 次,平均分 0.0

    加密类:

    import java.security.MessageDigest;
     
    import javax.crypto.KeyGenerator;
    import javax.crypto.Mac;
    import javax.crypto.SecretKey;
     
    import sun.misc.BASE64Decoder;
    import sun.misc.BASE64Encoder;
     
    /**
     * 基础加密组件
     * 
     */
    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());
        }
     
        /**
         * HMAC加密
         * 
         * @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);
     
        }

    测试类:
    import static org.junit.Assert.*;
    import org.junit.Test;
    public class CoderTest {
    @Test
    public void test() throws Exception {
    String inputStr = "简单加密";
    System.err.println("原文:\n" + inputStr);

    byte[] inputData = inputStr.getBytes();
    String code = Coder.encryptBASE64(inputData);

    System.err.println("BASE64加密后:\n" + code);

    byte[] output = Coder.decryptBASE64(code);

    String outputStr = new String(output);

    System.err.println("BASE64解密后:\n" + outputStr);

    // 验证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:\n" + md5.toString(16));

    BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));
    System.err.println("SHA:\n" + sha.toString(32));

    BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));
    System.err.println("HMAC:\n" + mac.toString(16));
    }
    }

    测试结果:

    原文:
    简单加密
    BASE64加密后:
    566A5Y2V5Yqg5a+G
    
    BASE64解密后:
    简单加密
    Mac密钥:
    uGxdHC+6ylRDaik++leFtGwiMbuYUJ6mqHWyhSgF4trVkVBBSQvY/a22xU8XT1RUemdCWW155Bke
    pBIpkd7QHg==
    
    MD5:
    -550b4d90349ad4629462113e7934de56
    SHA:
    91k9vo7p400cjkgfhjh0ia9qthsjagfn
    HMAC:
    2287d192387e95694bdbba2fa941009a

    注意
    编译时,可能会看到如下提示:

    引用

    警告:sun.misc.BASE64Decoder 是 Sun 的专用 API,可能会在未来版本中删除

    import sun.misc.BASE64Decoder;
    ^
    警告:sun.misc.BASE64Encoder 是 Sun 的专用 API,可能会在未来版本中删除

    import sun.misc.BASE64Encoder;
    ^

    BASE64Encoder 和BASE64Decoder是非官方JDK实现类。虽然可以在JDK里能找到并使用,但是在API里查不到。JRE 中 sun 和 com.sun 开头包的类都是未被文档化的,他们属于 java, javax 类库的基础,其中的实现大多数与底层平台有关,一般来说是不推荐使用的。

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/4227.html

    关于

    发表评论

    暂无评论

    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享