Base64
Android有提供冕茅,Java沒有提供
加密
Base64.encode(text.getBytes(), Base64.DEFAULT)提茁;
解密
Base64.decode(text.getBytes(),Base64.DEFAULT);
消息摘要算法
MD
MD5
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] encodeSrc = messageDigest.digest(src.getBytes());
應用:保護密碼,保存密碼摘要在數(shù)據(jù)庫陋气,然后服務器也使用摘要驗證密碼的正確性或者信息比較敏感的地方
SHA
SHA-1,SHA-2(SHA-224,SHA-256,SHA-384,SHA-512)
MessageDigest messageDigest = MessageDigest.getInstance("SHA");
byte[] shaCode = messageDigest.digest(src.getBytes());
應用:驗證數(shù)據(jù)是否完整
MAC
HMAC
KeyGenerator keyGenerator = KeyGenerator.getInstance("HmacMD5");
SecretKey secretKey = keyGenerator.generateKey();
//the key is created by java
byte[] defaultKey = secretKey.getEncoded();
Log.e("Security","default = " + printByteArray(defaultKey));
//the key is created by you
byte[] key = ByteToHexString.decodeHex(new char[]{'c','a','3','9'});
Log.e("Security","define the key = " + printByteArray(key));
SecretKey restore = new SecretKeySpec(key,"HmacMD5");
Mac mac = Mac.getInstance(restore.getAlgorithm());
mac.init(restore);
byte[] hmacMd5Byte = mac.doFinal(src.getBytes());
return ByteToHexString.encodeHexString(hmacMd5Byte);
對稱加密
DES
安全不夠篙耗,已經(jīng)很少使用了
// produce key
KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
keyGenerator.init(56);
SecretKey secretKey = keyGenerator.generateKey();
byte[] bytesKey = secretKey.getEncoded();
// change key
DESKeySpec dks = new DESKeySpec(bytesKey);
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
Key key = skf.generateSecret(dks);
//encode
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,key);
byte[] desByte = cipher.doFinal(src.getBytes());
//decode
Cipher decodeCipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
decodeCipher.init(Cipher.DECRYPT_MODE,key);
byte[] decodeSrc = decodeCipher.doFinal(desByte);
return new String(decodeSrc);
3DES
用法和DES一樣迫筑,只是更改算法名稱和長度
AES
DES替代者
try {
// produce key
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
//會根據(jù)相應的算法使用相應的長度
keyGenerator.init(new SecureRandom());
SecretKey secretKey = keyGenerator.generateKey();
byte[] bytesKey = secretKey.getEncoded();
// change key
Key key = new SecretKeySpec(bytesKey,"AES");
//encode
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE,key);
byte[] desByte = cipher.doFinal(src.getBytes());
//decode
Cipher decodeCipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
decodeCipher.init(Cipher.DECRYPT_MODE,key);
byte[] decodeSrc = decodeCipher.doFinal(desByte);
return new String(decodeSrc);
} catch (Exception e) {
e.printStackTrace();
}
PBE
PBE算法結(jié)合了摘要算法和DES算法的優(yōu)點
try {
//初始化鹽
SecureRandom random = new SecureRandom();
byte[] salt = random.generateSeed(8);
//口令與密鑰
String password = "love zgx";
PBEKeySpec pks = new PBEKeySpec(password.toCharArray());
SecretKeyFactory factory = SecretKeyFactory.getInstance("PBEWITHMD5andDES");
Key key = factory.generateSecret(pks);
//加密
PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt,100);
Cipher cipher = Cipher.getInstance("PBEWITHMD5andDES");
cipher.init(Cipher.ENCRYPT_MODE,key,pbeParameterSpec);
byte[] pbeTarget = cipher.doFinal(src.getBytes());
//解密
cipher.init(Cipher.DECRYPT_MODE,key,pbeParameterSpec);
byte[] pbeSrc = cipher.doFinal(pbeTarget);
return new String(pbeSrc);
}catch(Exception e){
}
非對稱加密
分公匙和私匙
DH密匙算法
RSA-基于因子分解
ELGamal-基于離散對數(shù)
數(shù)字簽名算法
帶有密鑰(公鑰宪赶,私鑰)的消息摘要算法,驗證數(shù)據(jù)完整性,認證數(shù)據(jù)來源脯燃,抗否認,私鑰簽名搂妻,公鑰驗證