JAVA中为我们提供了丰富的加密技术,可以基本的分为单向加密和非对称加密
1.单向加密算法
单向加密算法主要用来验证数据传输的过程中,是否被篡改过。
BASE64 严格地说,属于编码格式,而非加密算法
MD5(Message Digest algorithm 5,信息摘要算法)
SHA(Secure Hash Algorithm,安全散列算法)
HMAC(Hash Message Authentication Code,散列消息鉴别码
2.对称和非对称加密算法
对称和非对称加密算法主要采用公钥和私钥的形式,来对数据加密。
DES(Data Encryption Standard,数据加密算法)
PBE(Password-based encryption,基于密码验证)
RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)
DH(Diffie-Hellman算法,密钥一致协议)
DSA(Digital Signature Algorithm,数字签名)
ECC(Elliptic Curves Cryptography,椭圆曲线密码编码学)
更多理论的简介,请自行查阅,下面提供代码,来看一下。
基础加密
[java]view
plaincopy
packagecom.test;
importjava.security.MessageDigest;
importjavax.crypto.KeyGenerator;
importjavax.crypto.Mac;
importjavax.crypto.SecretKey;
importjavax.crypto.spec.SecretKeySpec;
importsun.misc.BASE64Decoder;
importsun.misc.BASE64Encoder;
/**
*@ClassName:coder
*@Description:加密组件
*@author:LUCKY
*@date:2016年1月4日下午1:24:12
*/
publicabstractclasscoder{
publicstaticfinalStringKEY_SHA="SHA";
publicstaticfinalStringKEY_MD5="MD5";
/**
*MAC算法可选以下多种算法
*
*
*HmacMD5
*HmacSHA1
*HmacSHA256
*HmacSHA384
*HmacSHA512
*
*/
publicstaticfinalStringKEY_MAC="HmacMD5";
/**
*BASE64解密
*
*@paramkey
*@return
*@throwsException
*/
publicstaticbyte[]decryptBASE64(Stringkey)throwsException{
return(newBASE64Decoder()).decodeBuffer(key);
}
/**
*BASE64加密
*
*@paramkey
*@return
*@throwsException
*/
publicstaticStringencryptBASE64(byte[]key)throwsException{
return(newBASE64Encoder()).encodeBuffer(key);
}
/**
*MD5加密
*
*@paramdata
*@return
*@throwsException
*/
publicstaticbyte[]encryptMD5(byte[]data)throwsException{
MessageDigestmd5=MessageDigest.getInstance(KEY_MD5);
md5.update(data);
returnmd5.digest();
}
/**
*SHA加密
*
*@paramdata
*@return
*@throwsException
*/
publicstaticbyte[]encryptSHA(byte[]data)throwsException{
MessageDigestsha=MessageDigest.getInstance(KEY_SHA);
sha.update(data);
returnsha.digest();
}
/**
*初始化HMAC密钥
*
*@return
*@throwsException
*/
publicstaticStringinitMacKey()throwsException{
KeyGeneratorkeyGenerator=KeyGenerator.getInstance(KEY_MAC);
SecretKeysecretKey=keyGenerator.generateKey();
returnencryptBASE64(secretKey.getEncoded());
}
/**
*HMAC加密
*
*@paramdata
*@paramkey
*@return
*@throwsException
*/
publicstaticbyte[]encryptHMAC(byte[]data,Stringkey)throwsException{
SecretKeysecretKey=newSecretKeySpec(decryptBASE64(key),KEY_MAC);
Macmac=Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
returnmac.doFinal(data);
}
}
RSA安全编码组件
[java]view
plaincopy
packagecom.test;
importjava.security.Key;
importjava.security.KeyFactory;
importjava.security.KeyPair;
importjava.security.KeyPairGenerator;
importjava.security.PrivateKey;
importjava.security.PublicKey;
importjava.security.Signature;
importjava.security.interfaces.RSAPrivateKey;
importjava.security.interfaces.RSAPublicKey;
importjava.security.spec.PKCS8EncodedKeySpec;
importjava.security.spec.X509EncodedKeySpec;
importjava.util.HashMap;
importjava.util.Map;
importjavax.crypto.Cipher;
/**
*@ClassName:RSACoder
*@Description:RSA安全编码组件
*@author:LUCKY
*@date:2016年1月4日下午1:25:34
*/
publicabstractclassRSACoderextendscoder{
publicstaticfinalStringKEY_ALGORITHM="RSA";
publicstaticfinalStringSIGNATURE_ALGORITHM="MD5withRSA";
privatestaticfinalStringPUBLIC_KEY="RSAPublicKey";
privatestaticfinalStringPRIVATE_KEY="RSAPrivateKey";
/**
*用私钥对信息生成数字签名
*
*@paramdata
*加密数据
*@paramprivateKey
*私钥
*
*@return
*@throwsException
*/
publicstaticStringsign(byte[]data,StringprivateKey)throwsException{
//解密由base64编码的私钥
byte[]keyBytes=decryptBASE64(privateKey);
//构造PKCS8EncodedKeySpec对象
PKCS8EncodedKeySpecpkcs8KeySpec=newPKCS8EncodedKeySpec(keyBytes);
//KEY_ALGORITHM指定的加密算法
KeyFactorykeyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
//取私钥匙对象
PrivateKeypriKey=keyFactory.generatePrivate(pkcs8KeySpec);
//用私钥对信息生成数字签名
Signaturesignature=Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(priKey);
signature.update(data);
return