BLAKE和BLAKE2是基于丹尼尔·J·伯恩斯坦ChaCha流密码的密码散列函数。与SHA-2一样,有两种不同字大小的变体。BLAKE-256和BLAKE-224使用32位字,分别产生256位和224位的摘要大小,而BLAKE-512和BLAKE-384分别使用64位字,产生512位和384位的摘要大小。在64位的x64和ARM体系结构上运行时,BLAKE2b比SHA-3,SHA-2,SHA-1和MD5更快。BLAKE2的安全性提供类似于SHA-3,优于SHA-2:免疫长度扩展攻击,来自随机预言机的无差异性等。BLAKE的改进版本BLAKE2于2012年12月21日宣布推出。BLAKE3于2020年1月9日宣布推出。
代码:

package main

import (
    "fmt"

    "golang.org/x/crypto/blake2b"
)

func main() {
    fmt.Println("go crypto blake2b_384 demo.")
    str1 := "https://const.net.cn/"
    w := blake2b.Sum384([]byte(str1))

    hashstr := fmt.Sprintf("blake2b_384 = %x ,blake2b_384 len = %d", w, len(w))
    fmt.Println(hashstr)
}

输出:

go run .
go crypto blake2b_384 demo.
blake2b_384 = b4ff9c11ed64a0dd6bb88be552973e9a8f918d5324178e713e2f2992de920f5a2962ae7899fb78bddbab8a5c3f860a08 ,blake2b_384 len = 48

BLAKE和BLAKE2是基于丹尼尔·J·伯恩斯坦ChaCha流密码的密码散列函数。与SHA-2一样,有两种不同字大小的变体。BLAKE-256和BLAKE-224使用32位字,分别产生256位和224位的摘要大小,而BLAKE-512和BLAKE-384分别使用64位字,产生512位和384位的摘要大小。在64位的x64和ARM体系结构上运行时,BLAKE2b比SHA-3,SHA-2,SHA-1和MD5更快。BLAKE2的安全性提供类似于SHA-3,优于SHA-2:免疫长度扩展攻击,来自随机预言机的无差异性等。BLAKE的改进版本BLAKE2于2012年12月21日宣布推出。BLAKE3于2020年1月9日宣布推出。
代码:

package main

import (
    "fmt"

    "golang.org/x/crypto/blake2b"
)

func main() {
    fmt.Println("go crypto blake2b_512 demo.")
    str1 := "https://const.net.cn/"
    w := blake2b.Sum512([]byte(str1))

    hashstr := fmt.Sprintf("blake2b_512 = %x ,blake2b_512 len = %d", w, len(w))
    fmt.Println(hashstr)
}

输出:

go run .
go crypto blake2b_512 demo.
blake2b_512 = 4331451a749ca61a9d10f856f5eef9c453c34df8f519d21d2e336037aada9d9f0a234477ea8c44157dcd5349b993c65f5a22ddc8703e30041bba5679b5ecd936 ,blake2b_512 len = 64
echo -n "https://const.net.cn/" | openssl dgst -blake2b512
(stdin)= 4331451a749ca61a9d10f856f5eef9c453c34df8f519d21d2e336037aada9d9f0a234477ea8c44157dcd5349b993c65f5a22ddc8703e30041bba5679b5ecd936

BLAKE和BLAKE2是基于丹尼尔·J·伯恩斯坦ChaCha流密码的密码散列函数。与SHA-2一样,有两种不同字大小的变体。BLAKE-256和BLAKE-224使用32位字,分别产生256位和224位的摘要大小,而BLAKE-512和BLAKE-384分别使用64位字,产生512位和384位的摘要大小。在64位的x64和ARM体系结构上运行时,BLAKE2b比SHA-3,SHA-2,SHA-1和MD5更快。BLAKE2的安全性提供类似于SHA-3,优于SHA-2:免疫长度扩展攻击,来自随机预言机的无差异性等。BLAKE的改进版本BLAKE2于2012年12月21日宣布推出。BLAKE3于2020年1月9日宣布推出。

If you are planning to produce checksum for files, you can consider using BLAKE2 is a cryptographic hash function. According to the official site, it is faster than MD5, SHA-1, SHA-2, and SHA-3.

代码:

package main

import (
    "encoding/hex"
    "fmt"
    "io"
    "log"
    "os"

    "golang.org/x/crypto/blake2b"
)

func main() {
    fmt.Println("go crypto blake2b_512 demo. blake2b hash file demo. blake2b hash file example.")
    str1 := "https://const.net.cn"
    str2 := "/"
    w, _ := blake2b.New512(nil)
    io.WriteString(w, str1)
    io.WriteString(w, str2)
    hash := w.Sum(nil)
    hashstr := fmt.Sprintf("blake2b_512 = %x ,blake2b_512 len = %d", hash, len(hash))
    fmt.Println(hashstr)

    //blake2b_512 hash file
    hasher, _ := blake2b.New512(nil)

    path := "/const/net/cn/file"
    f, err := os.Open(path)
    if err != nil {
        log.Fatal(err)
    }

    defer f.Close()

    if _, err := io.Copy(hasher, f); err != nil {
        log.Fatal(err)
    }

    filehash := hasher.Sum(nil)
    encodedHex := hex.EncodeToString(filehash[:])
    fmt.Printf("/const/net/cn/file hash = %s", encodedHex)
}

输出:

echo -n "https://const.net.cn/" > /const/net/cn/file
go run .
go crypto blake2b_512 demo. blake2b hash file demo. blake2b hash file example.
blake2b_512 = 4331451a749ca61a9d10f856f5eef9c453c34df8f519d21d2e336037aada9d9f0a234477ea8c44157dcd5349b993c65f5a22ddc8703e30041bba5679b5ecd936 ,blake2b_512 len = 64
/const/net/cn/file hash = 4331451a749ca61a9d10f856f5eef9c453c34df8f519d21d2e336037aada9d9f0a234477ea8c44157dcd5349b993c65f5a22ddc8703e30041bba5679b5ecd936

包含了md5,sha256,sha512,sha3_512,black2s,black2b等hash算法示例。
代码:

package main

import (
    "crypto/md5"
    "crypto/sha256"
    "crypto/sha512"
    "fmt"

    "golang.org/x/crypto/blake2b"
    "golang.org/x/crypto/blake2s"
    "golang.org/x/crypto/sha3"
)

func getHash(input string, hashType string) string {
    switch hashType {
    case "MD5":
        return fmt.Sprintf("%x", md5.Sum([]byte(input)))
    case "SHA256":
        return fmt.Sprintf("%x", sha256.Sum256([]byte(input)))
    case "SHA512":
        return fmt.Sprintf("%x", sha512.Sum512([]byte(input)))
    case "SHA3_512":
        return fmt.Sprintf("%x", sha3.Sum512([]byte(input)))
    case "BLAKE2s_256":
        return fmt.Sprintf("%x", blake2s.Sum256([]byte(input)))
    case "BLAKE2b_512":
        return fmt.Sprintf("%x", blake2b.Sum512([]byte(input)))
    default:
        return fmt.Sprintf("%x", sha256.Sum256([]byte(input)))
    }
}

func main() {
    fmt.Println("go md5,sha256,sha512,sha3_512,blake2s_256,blake2b_512 hash demo")
    fmt.Println("MD5:", getHash("https://const.net.cn/", "MD5"))
    fmt.Println("SHA256:", getHash("https://const.net.cn/", "SHA256"))
    fmt.Println("SHA512:", getHash("https://const.net.cn/", "SHA512"))
    fmt.Println("SHA3_512:", getHash("https://const.net.cn/", "SHA3_512"))
    fmt.Println("BLAKE2s_256:", getHash("https://const.net.cn/", "BLAKE2s_256"))
    fmt.Println("BLAKE2b_512:", getHash("https://const.net.cn/", "BLAKE2b_512"))
}

输出:

go run .
go md5,sha256,sha512,sha3_512,blake2s_256,blake2b_512 hash demo
MD5: 4b655b565c09136dd867a7e523371391
SHA256: 2249a0aa015fa72b155b297b331bc0e7e34052096c43297d9a2de3a2df38bded
SHA512: dee0877970a321da947b39223110525fa0d9a47d703bce0c5cd39066e25b1078b76d21d83657c35451484db62e5ef80e43a33769b1f626bb8940ad3890e64fd5
SHA3_512: 540bc484763d923575db2aec61fab3502524225f127270301d1cf7f572bf17cd252241322c9df8875df159e732f344cd2cb83991bfc1f3dfbe43c1887f366380
BLAKE2s_256: 5d91ecdf175b8f81bf3cd76c96f7fa1174d4cba8f4bcfa17d183bf4b20f7cdca
BLAKE2b_512: 4331451a749ca61a9d10f856f5eef9c453c34df8f519d21d2e336037aada9d9f0a234477ea8c44157dcd5349b993c65f5a22ddc8703e30041bba5679b5ecd936

直接上代码了。

package main

/*
#cgo CFLAGS: -I ./include
#cgo LDFLAGS: -L ./lib -lcrypto -ldl
#include <stdlib.h>
#include <openssl/evp.h>
#include <openssl/md5.h>
*/
import "C"

import (
    "fmt"
    "os"
    "unsafe"
)

func main() {
    strdigestname := "md4"
    strdata := "https://const.net.cn/"
    digestname := []byte(strdigestname)
    md := C.EVP_get_digestbyname((*C.char)(unsafe.Pointer(&digestname[0])))
    if md == nil {
        fmt.Printf("Unknown message digest %s\n", strdigestname)
        os.Exit(1)
    }
    md_value := make([]byte, 128)
    md_len := 0
    data := []byte(strdata)
    mdctx := C.EVP_MD_CTX_new()
    C.EVP_DigestInit(mdctx, md)
    C.EVP_DigestUpdate(mdctx, unsafe.Pointer(&data[0]), C.size_t(len(data)))
    C.EVP_DigestFinal_ex(mdctx, (*C.uchar)(unsafe.Pointer(&md_value[0])), (*C.uint)(unsafe.Pointer(&md_len)))
    C.EVP_MD_CTX_free(mdctx)

    fmt.Printf("message digest=%x %s message digest len=%d\n", md_value[0:md_len], strdigestname, md_len)
}

输出:

go run .
message digest=8496154e56f8ec218063863f51ba4319 md4 message digest len=16
echo -n "https://const.net.cn/" |openssl dgst -md4