Go语言MD5加密用法实例
Go語言MD5加密用法實例
本文實例講述了Go語言MD5加密用法。分享給大家供大家參考。具體實現方法如下:
復制代碼 代碼如下: import (??? "crypto/md5"
??? "encoding/hex"
)
func main() {
??? h := md5.New()
??? h.Write([]byte("sharejs.com")) // 需要加密的字符串為 sharejs.com
??? fmt.Printf("%s\n", hex.EncodeToString(h.Sum(nil))) // 輸出加密結果
}
/*******************************************************
Golang計算MD5
YangJunjie · 2014-12-30 12:00:01 · 11161 次點擊 · 預計閱讀時間 3 分鐘 · 大約1分鐘之前 開始瀏覽 ? ? 這是一個創建于 2014-12-30 12:00:01 的文章,其中的信息可能已經有所發展或是發生改變。Golang計算MD5
1.單向加密
什么是單向加密算法。簡而言之就是不可解密的加密方法,也叫作非可逆加密。這些學術 解釋都不用管它,反正就是一群數學家老爺爺通過各種證明得到的一種方法,用這種方法加密 過的東西,地球上現有的人類在有限的時間內是無法解密的,包括加密者自己。既然加密者自己 都無法解密,那這乖僻的加密算法有個毛用阿?哪些場景需要這種有去無回的加密方式呢?
這里先了解下單向加密的特征: 首先,不可解密性在上面已經提到了,目的就是掩藏明文。其次單向加密算法的另外兩個特征 使得它更接地氣,第一是任意兩段明文數據,加密以后的密文不能是相同的; 第二是任意一段明文數據,經過加密以后,其結果必須永遠是不變的。這樣當我們需要表征一段 唯一的內容,但是有不想別人知道該段內容時或者僅僅是為一個內容打上一個唯一的ID時,就可以 嘗試下單向加密算法。
比如,如果想對一段內容做緩存操作,為了更快的找到其內容,使用K-V的存儲方式。那么該如何 構建Key呢?當然有很多方法,比如時間。通過上面“"不同明文加密結果不同"特征,我們可以 用對該內容作單向加密,然后用加密結果做為key。又比如在用戶登陸的場景中,害怕別人通過劫 包的方式獲取用戶秘密,我們可以將該秘密進行單向加密存放到數據庫中,之后的驗證都對用戶 輸入的秘密進行單向加密,確保其在傳輸過程中“"不可見"。
那么常用的單向加密算法有哪些呢? 主要有:BASE64、MD5、SHA、HMAC,其中最為常見的就有MD5,BASE64。這里我們主要介紹最常 使用的MD5算法。該算法可以用來得到一個128bit的值,既可以作為K-V中的key,也可以對密碼 進行加密從而確保其在傳輸中"不可見"。
2.經典的MD5API
在C系列中計算MD5的API一般有如下幾個API構成。
-
init :獲得一個md5上下文
-
append/update : 添加明文,可以多次添加
-
final: 執行計算操作
-
digest/hex_digest: 獲得加密結果,結果為128bit內存值或者其32個16進制表示法。
Python的標準庫中也是提供了這幾個API,除此之外還提供了一個直接從文件中獲得明文計算MD5的 方法
3.Golang的"crypto/md5"
Golang的加密庫都放在crypto目錄下,其中MD5庫在crypto/md5包中,該包主要提供了New和Sum函數。 乍一看和以往的使用不太一樣。但是看完例子后發現,其宗旨還是一樣的,都是先創建一個MD5對象, 然后更新明文,接著加密輸出,最后打掃戰場。
先看個示例:
package?main import?("crypto/md5""fmt""encoding/hex" )func?main(){md5Ctx?:=?md5.New()md5Ctx.Write([]byte("test?md5?encrypto"))cipherStr?:=?md5Ctx.Sum(nil)fmt.Print(cipherStr)fmt.Print("\n")fmt.Print(hex.EncodeToString(cipherStr)) }這里直接對一串字符串計算MD5。其中通過md5.New()初始化一個MD5對象,其實它是一個hash.Hash對象。 函數原型為?func New() hash.Hash?。該對象實現了hash.Hash的Sum接口:計算出校驗和。其函數原型 為?func Sum(data []byte) [Size]byte?這里的官方Manual對其的描述我感覺有點問題。其官方描述為: " Sum returns the MD5 checksum of the data. "
通過翻閱源碼可以看到他并不是對data進行校驗計算,而是對hash.Hash對象內部存儲的內容進行校驗和 計算然后將其追加到data的后面形成一個新的byte切片。因此通常的使用方法就是將data置為nil
該方法返回一個Size大小的byte數組,對于MD5來說就是一個128bit的16字節byte數組。這里通過 []byte() 將一個字符串轉換成byte數組,還可以通過byte的其他接口進行轉換,Write方法在下面進行 說明。 hash.Hash對象內的存儲內容進行校驗和計算。那這個存儲內容是放在哪呢?通過Golang標準庫的代碼 md5.go,可以找到
type?digest?struct?{s???[4]uint32x???[chunk]bytenx??intlen?uint64 }這樣的類型。其內容就存在64字節的byte數組中。
4.明文接口
hash.Hash繼承了io.Write。因此可以將其當成一個輸入流進行內容的更新。上面已經看到了Write方法, 這里對其進行詳細介紹。該方法是從io.Write繼承而來,確切的說是繼承了一個接口,然后去實現它。 函數原型為:?Write(p []byte) (n int, err error)?,將p中的內容讀入并進行計算后存入到上面 digest的byte內存x中去。最后通過內部函數checkSum計算出其校驗和。
因此我們可以將Write方法看成是C系中的Update方法。Sum看成是Final方法。從上我們看到其結構為 128bit的內存表示法。那如何得到其32字節的16進制表示法呢?這里我們可以使用encoding/hex包中的 EncodeToString方法對其進行編碼.函數原型為?func EncodeToString(src []byte) string?直接 將Sum的返回結果給到src即可。這樣我們就可以進行簡單的對應來快速熟悉Golang的MD5接口操作了:
init()???????--?vs?--???md5.New() update()?????--?vs?--???md5Ctx.Write() final()??????--?vs?--???md5Ctx.Sum(nil) hex_digest()?--?vs?--???hex.EncodeToString()有了這幾個接口,就可以很方便的自己包裝一個對文件計算md5值的接口了。
本文來自:開源中國博客
感謝作者:YangJunjie
查看原文:Golang計算MD5
總結
以上是生活随笔為你收集整理的Go语言MD5加密用法实例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: golang hmac的sha1加密例子
- 下一篇: ubuntu 安装Gogland