在go語言中對數據計算一個md5,或sha256和其他語言 如java, php中的使用方式稍有不同, 那就是要加密的數據必須通過流的形式寫入到你創建的Hash對象中。
Hash數據加密步驟
1. 先使用對應的加密算法包中的New函數創建一個Hash對象,(這個也就是一個io.Writer) ;
? ? ? ? 如: sha := md5.New()
2.? 將要計算MD5/sha256的數據或者文件寫入這個writer;
? ? ? ? 如:io.WriteString(sha, "admin")?
? ? ? ? 文件hash計算:
? ? ? ? file,_:=os.Open("yourfile.txt")
? ? ? ? io.Copy(sha, file)? // 文件hash計算和字符串hash計算的區別就在這里,其他地方完全一樣
3. 最后在調用hash對象的方法Sum方法即可計算文件或者數據的MD5值;
? ? ? ? 如: b0 := sha.Sum(nil)? // 注意這個Sum方法對于計算Hash值時不需要傳參數,給他個nil 哄一下就行
4.? 返回值b0,這個值是16進制的unicode表示,需要使用 %x 將其格式化為可讀字符串.
? ? ? ? 如:?md5Str:=fmt.Sprintf("%x",b0)? ? ?
到此,整個hash加密過程就算完成了, 怎么樣是不是很簡單?
go語言中的其他Hash加密算法, 如 sha1, sha256, sha512等的加密步驟和方法也都是一樣的,唯一不同的地方就是在創建Hash對象的時候你使用的包名不一樣而已。
對于文件的hash值計算,
方法也是一樣的, 不同的地方就是在數據寫入的時候,把 io.WriteString(sha, "admin")? 替換為? io.Copy(sha, file)? 這里的file是你使用打開的要計算hash的文件對象指針,在這個地方被當做一個reader
Hash對象運行內存圖解
上圖可以幫助我們驗證go語言中的數據加密的運行方式,流式數據寫入, 還有hash對象中的這個Sum方法參數在對數據進行加密的時候?為什么必須為nil。
Hash對象運行內存圖解中的代碼: 這個是一個example測試用例,保存到 xxx_test.go 即可運行
package testimport ("crypto/md5""fmt""io"
)func ExampleMd5() {sha := md5.New()io.WriteString(sha, "admin") // 這里要計算MD5的字符串必須要以流的顯示寫入到hash對象中b0 := sha.Sum(nil) // 字節放到Sum參數里面最會將數據追加到流的前面返回,不會影響hash對象的數據.// 驗證fmt.Printf("admin對應的md5字節: %v 字符串: %x \n", b0, b0)b1 := sha.Sum([]byte("ab中")) // 這里傳遞的參數不會影響hash對象,僅附加到數據流的前面//Sum方法里面追加的參數 ab中 被轉換為 97 98 228 184 173 , 可見這里的97就是a的碼值,98是b的碼值,而 228 184 173 則是中對應的碼值因為一個漢字占3個字節所以這里有3個bytefmt.Printf(`Sum([]byte("admin"))后字節: %v 字符串: %x`, b1, b1)// output:// admin對應的md5字節: [33 35 47 41 122 87 165 167 67 137 74 14 74 128 31 195] 字符串: 21232f297a57a5a743894a0e4a801fc3// Sum([]byte("admin"))后字節: [97 98 228 184 173 33 35 47 41 122 87 165 167 67 137 74 14 74 128 31 195] 字符串: 6162e4b8ad21232f297a57a5a743894a0e4a801fc3
}