Java加密技术(一)
加密解密,曾经是我一个毕业设计的重要组件。在工作了多年以后回想当时那个加密、解密算法,实在是太单纯了。
Java代码
- /**?
- ?*?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);??
- }??
主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。Java代码
- /**?
- ?*?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();??
- ??
- }??
通常我们不直接使用上述MD5加密。通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。Java代码
- ????/**?
- ?????*?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();??
- ??
- ????}??
- }??
HMACJava代码
- /**?
- ?*?初始化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);??
- ??
- }??
给出一个完整类,如下:Java代码
- import?java.security.MessageDigest;??
- ??
- import?javax.crypto.KeyGenerator;??
- import?javax.crypto.Mac;??
- import?javax.crypto.SecretKey;??
- ??
- import?sun.misc.BASE64Decoder;??
- import?sun.misc.BASE64Encoder;??
- ??
- /**?
- ?*?基础加密组件?
- ?*??
- ?*?@author?梁栋?
- ?*?@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?{??
- border-left: #d1d7dc 1px solid; padding-bottom: 0px; line-height: 18px; backgro