什麼是加密和簽名
加密,用某種特殊的方式對資料進行處理,使普通的接受者無法正常處理資料。如常用的RSA
非對稱加密,MD5
,DES
和AES
對稱加密等等。簽名,在傳輸資料前先對資料
A
進行處理得到資料 B
,然後將A
和 B
傳送給接受者,接受者獲得資料後對資料 B
進行 解簽得到資料 C
,如果資料C
和資料A
一樣,則認為資料沒有被修改。從上面的介紹中可以看出,加密主要是用來使資料無法被正確識別,而簽名主要是用來確保資料未被修改。
哪些場景使用
在安全為重中之重的支付領域,常常會採用加密和加簽的方式來確保資料的安全性。由於RAS這種加密方式不容易被破解,因此通常使用它保證資料安全。
RAS又被稱為非對稱加密,擁有一個公鑰和一個私鑰,公鑰可以交給對方,私鑰自己儲存。公鑰用作加密使用,而私鑰用於簽名。
首先,商戶會生成一對公私鑰,公鑰交給銀行。而銀行同樣也會將生成的公鑰交給商戶。商戶向銀行傳送支付報文時,先用自身的私鑰對支付需要的引數進行簽名生成sign這個欄位,接著將sign這個欄位值和之前的引數用銀行的公鑰加密,接著通過某些傳輸協議傳送給銀行。
銀行得到報文後,用自身的私鑰進行解密,如果不能解開,證明不是商戶發的。如果解密成功,再用商戶的公鑰對sign進行解籤,與資料進行對比判斷。
為什麼
為什麼不用Des,Aes或者Md5。
Des這些對稱加密,需要的是一個key。這些key在一定條件下可以被暴力破解,MD5同樣也是如此。
為什麼不用公鑰加簽,私鑰加密?
假設用私鑰加密,公鑰加簽。那麼在商戶發給銀行的過程中,銀行需要用公鑰解密,由於公鑰是被暴露在外面的,如果被非銀行的人拿到,資料被解密後就能看到了,雖然他不能確定這些資料有沒有被修改過。而如果用公鑰加密,私鑰是掌握在銀行手中。
哪些地方需要注意
- 不一定Md5只能用來加密,同樣可以用來加簽。
- RAS雖然安全,但是會給開發帶來難度。
How to use
加簽
Map<String,String> map=new HashMap<>();
map.put("client_id", AppConstant.APPID);
map.put("method","user.baseinfo");
map.put("access_token",accessToken);
map.put("timestamp",String.valueOf(System.currentTimeMillis()));
map.put("client_secret",AppConstant.APPSECRET);
String sign= MD5.md5Sign(map);
map.put("sign",sign);
/**md5加簽**/
public static String md5Sign(Map<String,String> params){
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
// 第二步:把所有引數名和引數值串在一起
StringBuilder query = new StringBuilder();
for (String key : keys) {
String value = params.get(key);
query.append(key).append(value);
}
// 第三步:md5加密
return DigestUtils.md5Hex(query.toString());
}
複製程式碼
這段程式碼用的是md5方式進行加簽,在這邊應該可以看出來加簽只是加密的一種運用,因此任何一種加密方式都可以用做簽名。
結語
本人昨天剛剛離職,可能是更想去看看外面精彩的世界吧,和小智一樣想要成為神奇寶貝大師~~~ 附上答案:小火龍被訓練家拋棄的那段。不過是劇場版:《就決定是你了》
裡的場景。 猛戳我,連結哦。不知道大家有沒有看過,還是很好看的,我大皮神開口講話了!!!