散列函數(shù)(散列算法,又稱哈希函數(shù))是一種從任何一種數(shù)據(jù)中創(chuàng)建小的數(shù)字“指紋”的方法。散列函數(shù)把消息或數(shù)據(jù)壓縮成摘要,使得數(shù)據(jù)量變小,將數(shù)據(jù)的格式固定下來。該函數(shù)將數(shù)據(jù)打亂混合,重新創(chuàng)建一個叫做散列值的指紋。
隨機生成
加密密鑰需要盡可能的隨機,以便生成的密鑰很難再現(xiàn)。加密隨機數(shù)生成器必須生成無法通過計算方法推算出(低于p.05的概率)的輸出。
散列函數(shù)
基本特性:如果兩個散列值是不相同的(根據(jù)同一函數(shù)),那么這兩個散列值的原始輸入也是不相同的。這個特性是散列函數(shù)具有確定性的結(jié)果,具有這種性質(zhì)的散列函數(shù)稱為單向散列函數(shù)。但另一方面,散列函數(shù)的輸入和輸出不是唯一對應(yīng)關(guān)系的,如果兩個散列值相同,兩個輸入值很可能是相同的,但也可能不同,這種情況稱為“散列碰撞”。
主要應(yīng)用場景
- 文件校驗
- 數(shù)字簽名
- 鑒權(quán)協(xié)議
Go語言支持
go crypto標準包包含了一些常用的哈希算法,例如md5、sha1、sha256、sha512等。以sha1算法為例,了解下go如何生成哈希值。
package main
import (
"crypto/sha1"
"fmt"
"io"
"log"
"os"
)
func main() {
data := []byte("this is test, hello world, keep coding")
fmt.Printf("%x \n", sha1.Sum(data))
h := sha1.New()
io.WriteString(h, "this is test, hello world, keep coding")
fmt.Printf("%x \n", h.Sum(nil))
fmt.Printf("%x \n", shaFile("./file.txt"))
}
//shaFile利用sha1算法將目標文件生成哈希值
func shaFile(filePath string) []byte {
f, err := os.Open("file.txt")
if err != nil {
log.Fatal(err)
}
defer f.Close()
h := sha1.New()
if _, err := io.Copy(h, f); err != nil {
log.Fatal(err)
}
return h.Sum(nil)
}
程序運行結(jié)果為:
a1 7b 4a 11 04 95 e1 c4 70 8f a0 33 db 89 d6 f6 13 3d 6a 48
a1 7b 4a 11 04 95 e1 c4 70 8f a0 33 db 89 d6 f6 13 3d 6a 48
ccf59c07592fb103ff88062c924962b6f9839a9b
示例二:
go語言中提供了MD5、SHA-1等幾種哈希函數(shù),下面這個例子是使用MD5和SHA-1值來對內(nèi)容加密:
package main
import (
"crypto/md5"
"crypto/sha1"
"fmt"
)
func main() {
TestString := "Hi, pandaman!"
Md5Inst := md5.New()
Md5Inst.Write([]byte(TestString))
Result := Md5Inst.Sum([]byte(""))
fmt.Printf("%x\n\n", Result)
Sha1Inst := sha1.New()
Sha1Inst.Write([]byte(TestString))
Result = Sha1Inst.Sum([]byte(""))
fmt.Printf("%x\n\n", Result)
}
輸出結(jié)果為:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
您可能感興趣的文章:- Go語言中三種不同md5計算方式的性能比較
- Go語言對字符串進行MD5加密的方法
- Go語言MD5加密用法實例
- Golang的md5 hash計算操作