數(shù)據(jù)加密是過程通過對文件或數(shù)據(jù)進行算法計算后得到結(jié)果一種處理過程宽气,讓數(shù)據(jù)變成不能夠閱讀的形式随常,也可以根據(jù)不同的算法來解析生成的數(shù)據(jù),讓加密數(shù)據(jù)還原成原來的數(shù)據(jù)萄涯。通過加密來實現(xiàn)保護數(shù)據(jù)绪氛,讓數(shù)據(jù)不被別人竊取并閱讀的目的。加密的分類分為兩種非對稱加密和對稱加密涝影,下面介紹三種常見的加密使用枣察。
安全哈希算法(SHA)
安全哈希算法(Secure Hash Algorithm,縮寫為SHA)是一個密碼散列函數(shù)家族燃逻。能計算出一個數(shù)字消息所對應到的序目,長度固定的字符串的算法。安全哈希算法包含很多種算法其中包括(SHA系列 MD5 等等很多)唆樊,安全哈希算法是一種單向加密的過程宛琅,也就是說在加密之后沒有辦法解密,那么安全哈希算法有什么左右呢逗旁?
從上圖可以看出通過對相關文檔進行加密得到加密后的字符串嘿辟,再將文檔和字符串一起發(fā)送到服務器,服務器獲取到數(shù)據(jù)后再用相同的加密方法對相關文檔再次加密得到加密后的字符串片效,把在服務器得到的加密字符串與通過網(wǎng)絡接收到的加密字符串做比較红伦,如果相同就證明文檔沒有出問題(被人篡改一類操作),如果不同則認定為此次操作存在非法的可能性就終止操作即可淀衣。單向加密也可以用在密碼登錄時使用昙读,將用戶輸入的密碼加密后傳輸加密的字符串,服務器獲取加密字符串比對數(shù)據(jù)庫中的密碼加密結(jié)果判斷是否登錄膨桥。以上列舉兩種單向加密的使用場景蛮浑,可以知道單向加密只是生成加密后的字符串唠叛,再靈活的運用加密字符串和加密對象而已。
AES算法(高級加密標準)
AES算法(高級加密標準)是一種對稱加密算法一個密碼對應一個密鑰的形式沮稚,能夠加密同時也能解密艺沼。AES算法包括AES、AESWRAP蕴掏、DES障般、ARC4等等,與SHA算法比起來AES算法加密同時可以解密盛杰,Https連接支付寶時也是靠AES進行保護挽荡,下面是AES算法加密使用的代碼:
/**
* 加密
* @param content 加密內(nèi)容
* @param password 加密的密碼 用來生成密鑰
* @return
* @throws Exception 會拋出很多異常這里(NoSuchAlgorithmException 沒找到指定算法異常, InvalidKeyException 無效的key異常 等等)
*/
public byte[] encrypt(String content , String password) throws Exception {
//得到key生成器
KeyGenerator kgen = KeyGenerator.getInstance(ALGORITHM);
//初始化生成器
kgen.init(128,new SecureRandom(password.getBytes()));
//獲取秘鑰
SecretKey secretKey = kgen.generateKey();
//獲取ecode 編碼格式
byte[] enCodeFormat = secretKey.getEncoded();
//轉(zhuǎn)換成AES專用密鑰
SecretKeySpec key = new SecretKeySpec(enCodeFormat, ALGORITHM);
//將加密內(nèi)容轉(zhuǎn)為數(shù)組
byte[] c = content.getBytes();
//獲取密碼器
Cipher cipher = Cipher.getInstance(ALGORITHM);
//初始化密碼器 Cipher.ENCRYPT_MODE(加密模式)
cipher.init(Cipher.ENCRYPT_MODE,key);
//執(zhí)行doFinal獲取加密后結(jié)果
byte[] result = cipher.doFinal(c);
return result;
}
1.獲取
KeyGenerator
2.獲取秘鑰
3.獲取密碼器
4.初始化密碼器給出相應的操作模式
5.執(zhí)行doFinal執(zhí)行加密
/**
* 解密
* @param content 解密內(nèi)容
* @param password 解密的密碼 用來生成密鑰進行解密
* @return
* @throws Exception 會拋出很多異常這里(NoSuchAlgorithmException 沒找到指定算法異常, InvalidKeyException 無效的key異常 等等)
*/
public byte[] decrypt(byte[] content , String password) throws Exception {
//等到key生成器
KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
//初始化key生成器
keyGenerator.init(128,new SecureRandom(password.getBytes()));
//根據(jù)key生成器獲取秘鑰
SecretKey secretKey = keyGenerator.generateKey();
//根據(jù)秘鑰獲取ecode(編碼格式)
byte[] encoded = secretKey.getEncoded();
//生成AES指定的秘鑰
SecretKeySpec key = new SecretKeySpec(encoded,ALGORITHM);
//生成密碼器
Cipher cipher = Cipher.getInstance(ALGORITHM);
//初始化加密器 Cipher.DECRYPT_MODE(解密模式)
cipher.init(Cipher.DECRYPT_MODE,key);
//解密
byte[] result = cipher.doFinal(content);
return result;
}
下面執(zhí)行加密和解密代碼對leavy
字符串加密,結(jié)果如下:
從代碼上看加密過程和解密過程步驟唯一的區(qū)別就是在初始化密碼器給出相應的操作模式的時候即供,設置加密和解密模式對應的操作數(shù)值執(zhí)行不同操作定拟。
RSA算法
RSA算法是一種非對稱加密算法,RSA加密可靠性非常高募狂,目前只有短的RSA要是才能被強力破解办素,隨著加密位數(shù)的增加破解難度也會增加就更難破解。RSA加密需要一對鑰匙(公鑰祸穷、私鑰)性穿,使用一把鑰匙加密再使用另一把解密。獲取公鑰私鑰的代碼如下:
public static final String ALGORITHM_RSA = "RSA" ;
public static final String PUBLIC_KEY = "public_key.dat";
public static final String PRIVATE_KEY = "private_key.dat";
public static final int KEY_SIZE = 1024 ;
/***
* 生成密鑰對
* @throws NoSuchAlgorithmException
* @throws IOException
*/
public void generatorKeyPair() throws NoSuchAlgorithmException, IOException {
//獲取秘鑰對生成器
KeyPairGenerator kp = KeyPairGenerator.getInstance(ALGORITHM_RSA);
//初始化生成器 KEY_SIZE是1024 也可以是其他長度雷滚,長度越長越難破解也會更加密耗時
kp.initialize(KEY_SIZE,new SecureRandom());
//生成密鑰對
KeyPair keyPair = kp.generateKeyPair();
//獲取公鑰私鑰
PublicKey aPublic = keyPair.getPublic();
PrivateKey aPrivate = keyPair.getPrivate();
//把公鑰私鑰保存到文件中
ObjectOutputStream publicOs = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY));
ObjectOutputStream privateOS = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY));
//對象寫入文件
publicOs.writeObject(aPublic);
privateOS.writeObject(aPrivate);
//關流
privateOS.close();
publicOs.close();
}
獲取密鑰對之后可以進行加密解密操作需曾,代碼如下
/**
* 加密
* @param content 加密內(nèi)容
* @return
* @throws Exception IO異常加密異常等
*/
public String encrypt(String content) throws Exception {
//獲取公鑰
ObjectInputStream is = new ObjectInputStream(new FileInputStream(PUBLIC_KEY));
//讀對象流
Key key = (Key) is.readObject();
//關流
is.close();
//獲取密碼器
Cipher cipher = Cipher.getInstance(ALGORITHM_RSA);
//初始化密碼器 設置加密模式
cipher.init(Cipher.ENCRYPT_MODE,key);
//加密內(nèi)容轉(zhuǎn)數(shù)組
byte[] bytes = content.getBytes();
//加密
byte[] bytes1 = cipher.doFinal(bytes);
//方便觀看使用BASE64Encoder編碼一下
BASE64Encoder base64Encoder = new BASE64Encoder();
String encode = base64Encoder.encode(bytes1);
return encode;
}
/**
* 解密
* @param content 解密內(nèi)容
* @return
* @throws Exception IO異常加密異常等
*/
public String decrypt(String content)throws Exception {
//獲取公鑰
ObjectInputStream is = new ObjectInputStream(new FileInputStream(PRIVATE_KEY));
//讀對象流
Key key = (Key) is.readObject();
is.close();
//獲取密碼器
Cipher cipher = Cipher.getInstance(ALGORITHM_RSA);
//初始化密碼器 設置加密模式
cipher.init(Cipher.DECRYPT_MODE,key);
//加密時返回的字符串編碼過所以這里解碼下那都原始的加密數(shù)據(jù)
BASE64Decoder base64Decoder = new BASE64Decoder() ;
byte[] bytes = base64Decoder.decodeBuffer(content);
//解密
byte[] bytes1 = cipher.doFinal(bytes);
return new String(bytes1);
}
以下是使用RSA加密解密輸出結(jié)果:
使用RSA加密過程
1.獲取密鑰對為加密解密做準備
2.獲取密鑰
3.獲取密碼器并初始化設置密碼器模式
4.使用密碼器加密解密
在網(wǎng)絡請求時像https請求時,會將數(shù)據(jù)進行AES算法加密再用RSA算法加密祈远,最后在使用SHA加密(舉例說明實際不一定非要這樣加密過程呆万,算法一類都可以自己定制,三種算法組合使用)车份。這樣使https請求變成兩層加密還有一層校驗形式傳輸谋减。