-
- Base64可以解密、MD5、SHA、不行、也算不上是加密算法!
Base64可以解密、MD5、SHA、不行、也算不上是加密算法!
package com.boxun.crm.test;
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;
public abstract class Base64Test {
private static final String KEY_MD5 = "MD5";
private static final String KEY_SHA = "SHA";
/**
* 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 {
/**-- getInstance(String algorithm)返回實現指定摘要算法的 MessageDigest 對象 --*/
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 {
/**-- getInstance(String algorithm)返回生成指定算法的祕密密鑰的 KeyGenerator 對象 --*/
KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);
/**-- generateKey()生成一個密鑰 --*/
SecretKey secretKey = keyGenerator.generateKey();
/**-- secretKey.getEncoded()返回基本編碼格式的密鑰,如果此密鑰不支持編碼,則返回 null --
* encryptBASE64調用Base64加密方法
*/
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);
}
}
下面是main方法類:
- <PRE class=java name="code">package com.boxun.crm.test;
-
- import java.math.BigInteger;
-
-
-
-
-
-
-
-
- public class CoderTest {
-
- public void test() throws Exception {
- String inputStr = "單項加密";
- System.err.println("原值:\t" + inputStr);
-
- byte[] inputData = inputStr.getBytes();
- String code = Base64Test.encryptBASE64(inputData);
-
- System.err.println("BASE64加密後:\t" + code);
-
- byte[] output = Base64Test.decryptBASE64(code);
-
- String outputStr = new String(output);
-
- System.err.println("BASE64解密後:\t" + outputStr);
-
-
- assertEquals(inputStr, outputStr);
-
-
- assertArrayEquals(Base64Test.encryptMD5(inputData), Base64Test
- .encryptMD5(inputData),"MD5");
-
-
- assertArrayEquals(Base64Test.encryptSHA(inputData), Base64Test
- .encryptSHA(inputData),"SHA");
-
- String key = Base64Test.initMacKey();
- System.err.println("Mac密鑰:\t" + key);
-
-
- assertArrayEquals(Base64Test.encryptHMAC(inputData, key), Base64Test.encryptHMAC(
- inputData, key),"HMAC");
-
- BigInteger md5 = new BigInteger(Base64Test.encryptMD5(inputData));
- System.err.println("MD5:\t" + md5.toString(16));
-
- BigInteger sha = new BigInteger(Base64Test.encryptSHA(inputData));
- System.err.println("SHA:\t" + sha.toString(32));
-
- BigInteger mac = new BigInteger(Base64Test.encryptHMAC(inputData, inputStr));
- System.err.println("HMAC:\t" + mac.toString(16));
- }
-
- private void assertArrayEquals(byte[] encryptMD5, byte[] encryptMD52,String type) {
- String out = "不一致" ;
- byte[] by = encryptMD5 ;
- byte[] by2 = encryptMD52 ;
- String byt = "" ;
- String byt2 = "" ;
-
- for (int i = 0; i < by.length; i++) {
- byt += Integer.toHexString((by[i] & 0xFF) | 0x100).substring(1,3);
- }
- for (int i = 0; i < by2.length; i++) {
- byt2 += Integer.toHexString((by2[i] & 0xFF) | 0x100).substring(1,3);
- }
- if(byt.equals(byt2)){
- out = "一致" ;
- }
- System.out.println("驗證"+type+"對於同一內容,同一密鑰加密是否一致:"+out);
- System.out.println(byt + " "+type+" " + byt2);
- }
-
- private void assertEquals(String inputStr, String outputStr) {
- String out = "不一致" ;
- if(inputStr.equals(outputStr)){
- out = "一致" ;
- }
- System.out.println("驗證BASE64加密解密一致性:"+out);
- }
-
-
-
-
-
- public static void main(String[] args) throws Exception {
- CoderTest te = new CoderTest();
- te.test();
- }
-
-
-
- }