最近项目用到一些加密和安全算法,浏览了一些资料,
总觉得缺少一篇让新手快速入门的基础而且比较全面的文章,
这里把一些常用的安全算法和自己的总结发出来,有不对的地方请大家多多指教,
Orz~-~
首先要了解用到的编码格式:
Base64编码,通过名字来看,也就是通过64个字符来表示信息的一种方法,并不要把它当做一种加密算法,因为任何人都可以通过Base64编码后的内容逆向得出编码之前的信息,这里可以简单的理解为通过Base64编码之后,将二进制信息编码成可打印的字符,便于在网络上传输,至于原理,想深入研究的,可以自行度娘。
用到的方法也就是 : 一个负责编码一个负责解码
Base64.encodeBase64String(byte[] b)
Base64.decodeBase64(String s)
所谓的消息摘要算法,就是对一个消息或文本,产生一个固定长度的值(也就是摘要),采用的是单向的Hash函数对消息或文本进行计算产生,且不同的明文生成的摘要结果 "总是" 不同的,相同的明文产生的摘要 "必定" 一致。
这里目前最常用的摘要算法有 MD5 和 SHA1
MD5是由MD4,MD3,MD2改进而来,摘要长度为128位,在目前应用比较广泛。
主要功能代码如下:
MessageDigest md5=MessageDigest.getInstance("MD5");
BASE64Encoder base64 = new BASE64Encoder();
String newstr=base64.encode(md5.digest(str.getBytes("utf-8"))); //这里一般转为Base64或者16进制输出
MessageDigest md5=MessageDigest.getInstance("SHA-1");
BASE64Encoder base64 = new BASE64Encoder();
String newstr=base64.encode(md5.digest(str.getBytes("utf-8"))); //这里一般转为Base64或者16进制输出
public static String genKeyDES() throws Exception{
KeyGenerator keyGen = KeyGenerator.getInstance("DES"); //或者AES
keyGen.init(56); //128,192,256
SecretKey key = keyGen.generateKey();
BASE64Encoder base64 = new BASE64Encoder();
String base64Str = base64.encode(key.getEncoded());
return base64Str;
}
public static SecretKey loadKeyDES(String base64Key) throws Exception{
BASE64Decoder base64 = new BASE64Decoder();
byte[] bytes = base64.decodeBuffer(base64Key);
SecretKey key = new SecretKeySpec(bytes, "DES"); //或者AES
return key;
}
//加密
public static byte[] encryptDES(byte[] suorce,SecretKey key) throws Exception{
Cipher cipher = Cipher.getInstance("DES");
cipher.init(Cipher.ENCRYPT_MODE, key);
byte[] bytes = cipher.doFinal(source);
return bytes;
}
/**
* 初始化密钥对
* @return Map 甲方密钥的Map
* */
public static Map initKey() throws Exception{
//实例化密钥生成器
KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");
//初始化密钥生成器
keyPairGenerator.initialize(512); //密钥长度必须是64的倍数,在512到65536位之间
//生成密钥对
KeyPair keyPair=keyPairGenerator.generateKeyPair();
//甲方公钥
RSAPublicKey publicKey=(RSAPublicKey) keyPair.getPublic();
//甲方私钥
RSAPrivateKey privateKey=(RSAPrivateKey) keyPair.getPrivate();
}
/**
* 私钥解密
* @param data 待解密数据
* @param key 密钥
* @return byte[] 解密数据
* */
public static byte[] decryptByPrivateKey(byte[] data,byte[] key) throws Exception{
//取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(key);
KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
//生成私钥
PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);
//数据解密
Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 公钥解密
* @param data 待解密数据
* @param key 密钥
* @return byte[] 解密数据
* */
public static byte[] decryptByPublicKey(byte[] data,byte[] key) throws Exception{
//实例化密钥工厂
KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
//初始化公钥
//密钥材料转换
X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);
//产生公钥
PublicKey pubKey=keyFactory.generatePublic(x509KeySpec);
//数据解密
Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, pubKey);
return cipher.doFinal(data);
}
/**
* 私钥加密
* @param data待加密数据
* @param key 密钥
* @return byte[] 加密数据
* */
public static byte[] encryptByPrivateKey(byte[] data,byte[] key) throws Exception{
//取得私钥
PKCS8EncodedKeySpec pkcs8KeySpec=new PKCS8EncodedKeySpec(key);
KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
//生成私钥
PrivateKey privateKey=keyFactory.generatePrivate(pkcs8KeySpec);
//数据加密
Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, privateKey);
return cipher.doFinal(data);
}
/**
* 公钥加密
* @param data待加密数据
* @param key 密钥
* @return byte[] 加密数据
* */
public static byte[] encryptByPublicKey(byte[] data,byte[] key) throws Exception{
//实例化密钥工厂
KeyFactory keyFactory=KeyFactory.getInstance(KEY_ALGORITHM);
//初始化公钥
//密钥材料转换
X509EncodedKeySpec x509KeySpec=new X509EncodedKeySpec(key);
//产生公钥
PublicKey pubKey=keyFactory.generatePublic(x509KeySpec);
//数据加密
Cipher cipher=Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
return cipher.doFinal(data);
}
4:通过Base64编码的字符串加载公钥和私钥
/**
* 得到公钥
*
* @param key
* 密钥字符串(经过base64编码)
* @throws Exception
*/
public static PublicKey getPublicKey(String base64PublicKey) throws Exception {
byte[] keyBytes = Base64.decode(base64PublicKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
return publicKey;
}
/**
* 得到私钥
*
* @param key
* 密钥字符串(经过base64编码)
* @throws Exception
*/
public static PrivateKey getPrivateKey(String base64PrivateKey) throws Exception {
byte[] keyBytes = Base64.decode(base64PrivateKey);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
return privateKey;
}
/**
* RSA签名
*
* @param content
* 待签名数据
* @param privateKey
* 私钥
* @param inputCharset
* 编码格式
* @return 签名值
*/
public static String genSign(String content, String privateKey, String inputCharset) {
try {
PrivateKey priKey = RSA.getPrivateKey(privateKey);
java.security.Signature signature = java.security.Signature.getInstance("SHA1withRSA");
signature.initSign(priKey);
signature.update(content.getBytes(inputCharset));
byte[] signed = signature.sign();
return Base64.encodeBase64String(signed);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* RSA验签名检查
*
* @param content
* 待签名数据
* @param sign
* 签名值
* @param mchPublicKey
* 公钥
* @param inputCharset
* 编码格式
* @return 布尔值
*/
public static boolean verifySign(String content, String sign, String publicKey, String inputCharset) {
try {
PublicKey pubKey = RSA.getPublicKey(publicKey);
java.security.Signature signature = java.security.Signature.getInstance("SHA1withRSA");
signature.initVerify(pubKey);
signature.update(content.getBytes(inputCharset));
boolean bverify = signature.verify(Base64.decodeBase64(sign));
return bverify;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
以上只列举出了关键部分代码,都是测试过可以使用的,根据需要修改即可。