算法系列:5分钟了解哈希算法
前言
哈希算法是現代密碼體系中的一個重要組成部分。大家比較感興趣的數字貨幣,就使用了哈希算法。
哈希算法簡介
哈希(hash)算法又稱為散列算法,通過hash算法,可以將任意長度的信息轉換成一個固定長度的二進制數據,我們經常會使用十六進制值來表示轉換后的信息。
比如,數字123,使用md5的hash算法后,得到十六進制的值:202cb962ac59075b964b07152d234b70
哈希算法的特點:
(1)不同的信息,理論上得到的hash值不同,我們稱之為“無碰撞”,或者發生“碰撞”的概率非常小。
(2)不可逆,hash算法是單向的,從hash值反向推導出原始信息是很困難的。所以,有些系統中,我們可以使用hash算法對密碼進行處理后保存。
hash算法的主要應用:
(1) 數據完整性校驗
我們可以將原始數據和經過哈希算法得到數據一塊發送給對方,對方收到數據之后,對數據使用相同的哈希算法進行計算,如果得到的哈希值和對方發過來的相同,那么就說明數據沒有經過篡改。
(2) 數字簽名
一般我們先對原始數據進行hash處理,然后對處理后的數據使用私鑰進行加密。將原始數據和加密后數據發送給接收方。接收方使用公鑰解密,然后對數據進行hash處理,最后對比,借此實現用戶身份的驗證。
常見哈希算法
1 MD5
MD5在90年代初由MIT的計算機科學實驗室和RSA Data Security Inc發明,經MD2、MD3和MD4發展而來。
MD5以512位分組來處理輸入的信息,且每一分組又被劃分為16個32位子分組,經過了一系列的處理后,算法的輸出由四個32位分組組成,將這四個32位分組級聯后將生成一個128bit位散列值。
2 SHA-1
SHA(Secure Hash Algorithm)安全散列算法是一個密碼散列家族,由美國國家安全局(NSA)所設計,也是一種哈希算法。
SHA-1 算法輸入以512位數據塊為單位處理,產生160比特的消息摘要作為輸出。
3 代碼
如果我們想使用相關hash算法進行處理,一般不需要自己進行實現,只需要調用java或者第三方提供的代碼即可。比如,如果想根據md5算法得到一個字符串的的hash值,代碼如下:
public static String md5(String plainText) {
//定義一個字節數組
byte[] secretBytes = null;
try {
// 生成一個MD5計算摘要的對象
MessageDigest md = MessageDigest.getInstance("MD5");
//對字符串進行hash處理
md.update(plainText.getBytes());
//獲得hash運算后數據
secretBytes = md.digest();
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("沒有md5這個算法!");
}
//將hash后的數據轉換為16進制數字
String md5code = new BigInteger(1, secretBytes).toString(16);// 16進制數字
// 如果生成數字未滿32位,需要前面補0
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
return md5code;
}
總結
哈希算法有很多,計算過程也比較復雜,但是大多數情況下,我們不用自己寫代碼實現這些算法,只需要調用相關算法庫中的方法即可。
總結
以上是生活随笔為你收集整理的算法系列:5分钟了解哈希算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【跃迁之路】【671天】程序员高效学习方
- 下一篇: 架构阅读笔记3