go語言加解密算法 md5 sha256

MD5

  1. md5介紹

    md5的全稱爲md5信息摘要算法(MD5 Message-Digest Algorithm),是一種被廣泛應用的密碼散列函數,產生一個128位(16字節)的散列值,最常見的是32位的16進製表示,如:0caa3b23b8da53f9e4e041d95dc8fa2c,用以確保信息傳輸的完整一致。md5將整個文件當做一個大文本信息,通過不可逆的字符串變換算法,產生一個唯一的md5信息摘要,文件的md5類似於人的指紋,是世界上獨一無二的,如果任何人對文件做了改動,其md5值也會發生變化。

    md5與對稱和非對稱的加密算法不同,這兩種密碼是防止信息被竊取,而md5的目的是驗證原文的完整性。

  2. md5的特性

    • 不可逆

      沒有系統有辦法知道md5原來的文字是什麼

    • 具有高度的離散性

      md5碼具有高度的散列性,沒有規律可循,哪怕原信息只有一點點的變化,比如多個空格,那麼就會導致md5發生巨大變化,也可以說產生的md5碼是不可預測的

    • 壓縮性

      任意長度的數據,算出的md5值得長度都是固定的。

    • 弱碰撞性

      已知原數據和其md5的值,想找到一個具有相同md5值得數據(即僞造數據)是非常困難的。

  3. md5的用途

    • 密碼的加密存儲

      用戶設置密碼時,服務端只記錄這個密碼的MD5,而不記錄密碼本身,以後驗證用戶身份時,只需要將用戶輸入的密碼再次做一下MD5後,與記錄的MD5作一個比較即可驗證其密碼的合法性。

    • 數字簽名

      比如發佈一個程序,爲了防止別人在你的程序裏插入病毒或木馬,你可以在發佈這個程序的同時,公開這個程序文件的MD5碼,這樣別人只需要在任何地方下載這個程序後做一次MD5,然後跟公開的這個MD5作一個比較就知道這個程序是否被第三方修改過。

    • 文件完整性驗證

      比如當下載一個文件時,服務器返回的信息中包括這個文件的md5,在本地下載完畢時進行md5,將兩個md5值進行比較,如果一致則說明文件完整沒有丟包現象

    • 文件上傳

      比如百度雲實現的秒傳,就是對比你上傳的文件md5在百度服務器是否已經存在了。

  4. 注意事項

    • 同一個文件用不同的語言計算出來的md5一樣嗎?

      只要算法正確,都是一樣的。

    • 拷貝的文件md5會改變嗎?

      不會。

    • 還有什麼其他的摘要算法麼?

      SHA-1,SHA-2(包括SHA-224,SHA-256,SHA-384)等

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)。

  1. 字符串的哈希值

    計算字符串的哈希值,一共分爲3步:

    1. 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)
}
  1. 文件哈希值
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
 }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章