zoukankan      html  css  js  c++  java
  • BASE64,MD5,SHA,HMAC加密與解密算法(java)

      1 package com.ice.webos.util.security;
    2
    3 import java.io.UnsupportedEncodingException;
    4 import java.math.BigInteger;
    5 import java.security.Key;
    6 import java.security.MessageDigest;
    7 import java.security.SecureRandom;
    8
    9 import javax.crypto.Cipher;
    10 import javax.crypto.KeyGenerator;
    11 import javax.crypto.Mac;
    12 import javax.crypto.SecretKey;
    13 import javax.crypto.SecretKeyFactory;
    14 import javax.crypto.spec.DESKeySpec;
    15 import javax.crypto.spec.SecretKeySpec;
    16
    17 import sun.misc.BASE64Decoder;
    18 import sun.misc.BASE64Encoder;
    19
    20 /**
    21 * <ul>
    22 * <li>BASE64的加密解密是双向的,可以求反解。</li>
    23 * <li>MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。</li>
    24 * <li>HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外的不可控因素。</li>
    25 * <li>DES DES-Data Encryption Standard,即数据加密算法。
    26 * DES算法的入口参数有三个:Key、Data、Mode。
    27 * <ul>
    28 * <li>Key:8个字节共64位,是DES算法的工作密钥;</li>
    29 * <li>Data:8个字节64位,是要被加密或被解密的数据;</li>
    30 * <li>Mode:DES的工作方式,有两种:加密或解密。</li>
    31 * </ul>
    32 * </li>
    33 * <ul>
    34 *
    35 * @author Ice_Liu
    36 *
    37 */
    38 public class CryptUtil {
    39 private static final String KEY_MD5 = "MD5";
    40 private static final String KEY_SHA = "SHA";
    41 /**
    42 * MAC算法可选以下多种算法
    43 *
    44 * <pre>
    45 *
    46 * HmacMD5
    47 * HmacSHA1
    48 * HmacSHA256
    49 * HmacSHA384
    50 * HmacSHA512
    51 * </pre>
    52 */
    53 public static final String KEY_MAC = "HmacMD5";
    54
    55 /**
    56 * BASE64解密
    57 *
    58 * @param key
    59 * @return
    60 * @throws Exception
    61 */
    62 public static byte[] decryptBASE64(String key) throws Exception {
    63 return (new BASE64Decoder()).decodeBuffer(key);
    64 }
    65
    66 /**
    67 * BASE64 加密
    68 *
    69 * @param key
    70 * @return
    71 * @throws Exception
    72 */
    73 public static String encryptBASE64(byte[] key) throws Exception {
    74 return (new BASE64Encoder()).encodeBuffer(key);
    75 }
    76
    77 /**
    78 * MD5加密
    79 *
    80 * @param data
    81 * @return
    82 * @throws Exception
    83 */
    84 public static byte[] encryptMD5(byte[] data) throws Exception {
    85
    86 MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);
    87 md5.update(data);
    88
    89 return md5.digest();
    90
    91 }
    92
    93 /**
    94 * SHA加密
    95 *
    96 * @param data
    97 * @return
    98 * @throws Exception
    99 */
    100 public static byte[] encryptSHA(byte[] data) throws Exception {
    101
    102 MessageDigest sha = MessageDigest.getInstance(KEY_SHA);
    103 sha.update(data);
    104
    105 return sha.digest();
    106
    107 }
    108
    109 /**
    110 * 初始化HMAC密钥
    111 *
    112 * @return
    113 * @throws Exception
    114 */
    115 public static String initMacKey() throws Exception {
    116 KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
    117 SecretKey secretKey = keyGenerator.generateKey();
    118 return encryptBASE64(secretKey.getEncoded());
    119 }
    120
    121 /**
    122 * HMAC 加密
    123 *
    124 * @param data
    125 * @param key
    126 * @return
    127 * @throws Exception
    128 */
    129 public static byte[] encryptHMAC(byte[] data, String key) throws Exception {
    130 SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);
    131 Mac mac = Mac.getInstance(secretKey.getAlgorithm());
    132 mac.init(secretKey);
    133 return mac.doFinal(data);
    134 }
    135
    136 /**
    137 * DES 算法 <br>
    138 * 可替换为以下任意一种算法,同时key值的size相应改变。
    139 *
    140 * <pre>
    141 * DES key size must be equal to 56
    142 * DESede(TripleDES) key size must be equal to 112 or 168
    143 * AES key size must be equal to 128, 192 or 256,but 192 and 256 bits may not be available
    144 * Blowfish key size must be multiple of 8, and can only range from 32 to 448 (inclusive)
    145 * RC2 key size must be between 40 and 1024 bits
    146 * RC4(ARCFOUR) key size must be between 40 and 1024 bits
    147 * </pre>
    148 */
    149 public static final String ALGORITHM = "DES";
    150
    151 /**
    152 * DES 算法转换密钥<br>
    153 *
    154 * @param key
    155 * @return
    156 * @throws Exception
    157 */
    158 private static Key toKey(byte[] key) throws Exception {
    159 SecretKey secretKey = null;
    160 if (ALGORITHM.equals("DES") || ALGORITHM.equals("DESede")) {
    161 DESKeySpec dks = new DESKeySpec(key);
    162 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(ALGORITHM);
    163 secretKey = keyFactory.generateSecret(dks);
    164 } else {
    165 // 当使用其他对称加密算法时,如AES、Blowfish等算法时,用下述代码替换上述三行代码
    166 secretKey = new SecretKeySpec(key, ALGORITHM);
    167 }
    168 return secretKey;
    169 }
    170
    171 /**
    172 * DES 算法解密
    173 *
    174 * @param data
    175 * @param key
    176 * @return
    177 * @throws Exception
    178 */
    179 public static byte[] decrypt(byte[] data, String key) throws Exception {
    180 Key k = toKey(decryptBASE64(key));
    181 Cipher cipher = Cipher.getInstance(ALGORITHM);
    182 cipher.init(Cipher.DECRYPT_MODE, k);
    183 return cipher.doFinal(data);
    184 }
    185
    186 /**
    187 * DES 算法加密
    188 *
    189 * @param data
    190 * @param key
    191 * @return
    192 * @throws Exception
    193 */
    194 public static byte[] encrypt(byte[] data, String key) throws Exception {
    195 Key k = toKey(decryptBASE64(key));
    196 Cipher cipher = Cipher.getInstance(ALGORITHM);
    197 cipher.init(Cipher.ENCRYPT_MODE, k);
    198 return cipher.doFinal(data);
    199 }
    200
    201 /**
    202 * DES 算法生成密钥
    203 *
    204 * @return
    205 * @throws Exception
    206 */
    207 public static String initKey() throws Exception {
    208 return initKey(null);
    209 }
    210
    211 /**
    212 * DES 算法生成密钥
    213 *
    214 * @param seed
    215 * @return
    216 * @throws Exception
    217 */
    218 public static String initKey(String seed) throws Exception {
    219 SecureRandom secureRandom = null;
    220 if (seed != null) {
    221 secureRandom = new SecureRandom(decryptBASE64(seed));
    222 } else {
    223 secureRandom = new SecureRandom();
    224 }
    225 KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM);
    226 kg.init(secureRandom);
    227 SecretKey secretKey = kg.generateKey();
    228 return encryptBASE64(secretKey.getEncoded());
    229 }
    230
    231 public static void main(String[] args) {
    232 try {
    233 String s = "阿伯才的覆盖";
    234 String b = CryptUtil.encryptBASE64(s.getBytes("UTF-8"));
    235 System.out.println("BASE64加密后:" + b);
    236 byte[] c = CryptUtil.decryptBASE64(b);
    237 System.out.println("BASE64解密后:" + new String(c, "UTF-8"));
    238
    239 c = encryptMD5(s.getBytes());
    240 System.out.println("MD5 加密后:" + new BigInteger(c).toString(16));
    241
    242 c = encryptSHA(s.getBytes());
    243 System.out.println("SHA 加密后:" + new BigInteger(c).toString(16));
    244
    245 String key = initMacKey();
    246 System.out.println("HMAC密匙:" + key);
    247 c = encryptHMAC(s.getBytes(), key);
    248 System.out.println("HMAC 加密后:" + new BigInteger(c).toString(16));
    249
    250 key = initKey();
    251 System.out.println(ALGORITHM + "密钥:\t" + key);
    252 c = encrypt(s.getBytes("UTF-8"), key);
    253 System.out.println(ALGORITHM + " 加密后:" + new BigInteger(c).toString(16));
    254 c = decrypt(c, key);
    255 System.out.println(ALGORITHM + " 解密后:" + new String(c, "UTF-8"));
    256 } catch (UnsupportedEncodingException e) {
    257 // TODO Auto-generated catch block
    258 e.printStackTrace();
    259 } catch (Exception e) {
    260 // TODO Auto-generated catch block
    261 e.printStackTrace();
    262 }
    263 }
    264 }
  • 相关阅读:
    keras环境搭建
    通过程序自动设置网卡的“internet共享”选项
    编译pjsip源码
    电商开发必备,淘宝商品和类目体系是如何设计的
    pom.xml成了普通xml文件
    springboot application.properties不生效
    SpringBoot进阶教程(七十二)整合Apollo
    SpringBoot进阶教程(七十一)详解Prometheus+Grafana
    SpringBoot进阶教程(七十)SkyWalking
    Java8 lamda表达式
  • 原文地址:https://www.cnblogs.com/liubin0509/p/2331066.html
Copyright © 2011-2022 走看看