MD5
-
md5介紹
md5的全稱爲md5信息摘要算法(MD5 Message-Digest Algorithm),是一種被廣泛應用的密碼散列函數,產生一個128位(16字節)的散列值,最常見的是32位的16進製表示,如:0caa3b23b8da53f9e4e041d95dc8fa2c,用以確保信息傳輸的完整一致。md5將整個文件當做一個大文本信息,通過不可逆的字符串變換算法,產生一個唯一的md5信息摘要,文件的md5類似於人的指紋,是世界上獨一無二的,如果任何人對文件做了改動,其md5值也會發生變化。
md5與對稱和非對稱的加密算法不同,這兩種密碼是防止信息被竊取,而md5的目的是驗證原文的完整性。
-
md5的特性
-
不可逆
沒有系統有辦法知道md5原來的文字是什麼
-
具有高度的離散性
md5碼具有高度的散列性,沒有規律可循,哪怕原信息只有一點點的變化,比如多個空格,那麼就會導致md5發生巨大變化,也可以說產生的md5碼是不可預測的
-
壓縮性
任意長度的數據,算出的md5值得長度都是固定的。
-
弱碰撞性
已知原數據和其md5的值,想找到一個具有相同md5值得數據(即僞造數據)是非常困難的。
-
-
md5的用途
-
密碼的加密存儲
用戶設置密碼時,服務端只記錄這個密碼的MD5,而不記錄密碼本身,以後驗證用戶身份時,只需要將用戶輸入的密碼再次做一下MD5後,與記錄的MD5作一個比較即可驗證其密碼的合法性。
-
數字簽名
比如發佈一個程序,爲了防止別人在你的程序裏插入病毒或木馬,你可以在發佈這個程序的同時,公開這個程序文件的MD5碼,這樣別人只需要在任何地方下載這個程序後做一次MD5,然後跟公開的這個MD5作一個比較就知道這個程序是否被第三方修改過。
-
文件完整性驗證
比如當下載一個文件時,服務器返回的信息中包括這個文件的md5,在本地下載完畢時進行md5,將兩個md5值進行比較,如果一致則說明文件完整沒有丟包現象
-
文件上傳
比如百度雲實現的秒傳,就是對比你上傳的文件md5在百度服務器是否已經存在了。
-
-
注意事項
SHA256
SHA256 是安全散列算法 SHA(Secure Hash Algorithm)系列算法之一,其摘要長度爲256 bits,即32個字節,故稱SHA256。SHA系列算法是美國國家安全局 (NSA) 設計,美國國家標準與技術研究院(NIST) 發佈的一系列密碼散列函數,包括SHA-1、SHA-224、SHA-256、SHA-384 和 SHA-512 等變體。主要適用於數字簽名標準(DigitalSignature Standard DSS)裏面定義的數字簽名算法(Digital Signature Algorithm DSA)。
-
字符串的哈希值
計算字符串的哈希值,一共分爲3步:
- sha256.New 2. Write中寫入需要hash的內容 3. h.Sum生成hash值
func hashSHA256String(input string) []byte{
h := sha256.New()
h.Write([]byte(input))
return h.Sum(nil)
}
- 文件哈希值
func hashSHA256File(filePath string)(string, error) {
var hashValue string
file, err := os.Open(filePath)
if err != nil {
fmt.Printf("openfile error!")
return hashValue, err
}
defer file.Close()
hash := sha256.New()
if _, err := io.Copy(hash, file); err != nil {
return hashValue, err
}
hashInBytes := hash.Sum(nil)
hashValue = hex.EncodeToString(hashInBytes)
return hashValue, nil
}