vlambda博客
学习文章列表

Go语言的 哈希加密 算法,你是如何使用的?

最近在学习Golang,所以将学习过程记为笔记,以后翻阅的时候也方便,顺便也给大家做一点分享,希望能坚持下去。



学习与交流:


现在就开始你的Go语言学习之旅吧!人生苦短,let’s Go.




学过其他语言的都知道哈希算法了,在Go语言里是如何使用的,我们也来看看吧!

首先是常见的MD5

128bit,16字节
如:md5 (“hello world!”) = fc3ff98e8c6a0d3087d515c0473f8677 // 32位16进制数字

func Test(t *testing.T) {
    //方法一
    str := "hello world!"
    has := md5.Sum([]byte(str))
    md5str1 := fmt.Sprintf("%x", has) //将[]byte转成16进制
    t.Log(md5str1)

    //方法二
    w := md5.New()
    io.WriteString(w, str)
    md5str2 := fmt.Sprintf("%x", w.Sum(nil))
    t.Log(md5str2)
}

SHA1

160bit,20字节
如:SHA1 (“hello world!”) = 430ce34d020724ed75a196dfc2ad67c77772d169 // 40位16进制数字

func Test(t *testing.T) {
    str := "hello world!"

    //产生一个散列值得方式是 sha1.New(),sha1.Write(bytes),然后 sha1.Sum([]byte{})。
    h := sha1.New()

    //写入要处理的字节。
    h.Write([]byte(str))

    //SHA1 值经常以 16 进制输出,例如在 git commit 中。
    t.Log(hex.EncodeToString(h.Sum(nil)))
}

RIPEMD-160

160bit,20字节
如:RIPEMD-160 (“hello world!”) = dffd03137b3a333d5754813399a5f437acd694e5 // 40位16进制数字

func Test(t *testing.T) {
    str := "hello world!"

    h := ripemd160.New()
    h.Write([]byte(str))
    t.Log(hex.EncodeToString(h.Sum(nil)))
}

SHA256

256bit,32字节
如:SHA256 (“hello world!”) = 7509e5bda0c762d2bac7f90d758b5b2263fa01ccbc542ab5e3df163be08e6ca9 // 64位16进制数字

func Test(t *testing.T) {
    str := "hello world!"

    // 第一种调用方法
    sum := sha256.Sum256([]byte(str))
    t.Logf("%x\n", sum)

    // 第二种调用方法
    h := sha256.New()
    io.WriteString(h,str)
    t.Log(hex.EncodeToString(h.Sum(nil)))
}


SHA256实现原理

SHA-256算法输⼊报⽂的最⼤⻓度不超过2^64 bit,输⼊按512bit分组进⾏处理,产⽣的输出是⼀个256bit的报⽂摘要。


SHA256算法包括以下⼏步:

附加填充⽐特
对报⽂进⾏填充,使报⽂⻓度与448 模512 同余(⻓度=448 mod512),填充的⽐特数范围是1 到512,填充⽐特串的最⾼位为1,其余位为0。
就是先在报⽂后⾯加⼀个 1,再加很多个0,直到⻓度满⾜mod512=448。为什么是448,因为448+64=512。第⼆步会加上⼀个64bit的原始报⽂的 ⻓度信息。
附加⻓度值
将⽤64bit 表示的初始报⽂(填充前)的位⻓度附加在步骤1的结果后(低位字节优先)初始化缓存
使⽤⼀个256bit 的缓存来存放该散列函数的中间及最终结果。
该缓存表示为:
A=0x6A09E667
B=0xBB67AE85
C=0x3C6EF372
D=0xA54FF53A
E=0x510E527F
F=0x9B05688C
G=0x1F83D9AB
H=0x5BE0CD19处理512bit(16 个字)报⽂分组序列

该算法使⽤了六种基本逻辑函数,由64 步迭代运算组成。每步都以256bit 缓存ABCDEFGH 为输⼊,然后更新缓存内容。每步使⽤⼀个32bit 常数值Kt 和⼀个32bit Wt。

SHA512

512bit,64字节

如:SHA512 (“hello world!”) = db9b1cd3262dee37756a09b9064973589847caa8e53d31a9d142ea2701b1b28abd97838bb9a27068ba305dc8d04a45a1fcf079de54d607666996b3cc54f6b67c // 128位16进制数字

func Test(t *testing.T) {
    str := "hello world!"

    // 第一种调用方法
    sum := sha512.Sum512([]byte(str))
    t.Logf("%x\n", sum)

    // 第二种调用方法
    h := sha512.New()
    io.WriteString(h,str)
    t.Log(hex.EncodeToString(h.Sum(nil)))
}



参考链接:https://www.jb51.net/article/219646.htm