分类 Go 下的文章

“Go是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。 罗伯特·格瑞史莫、罗勃·派克及肯·汤普逊于2007年9月开始设计Go,稍后伊恩·兰斯·泰勒、拉斯·考克斯加入项目。Go是基于Inferno操作系统所开发的。”

在golang中使用cgo调用openssl库的md5方法,使用MD5_Init, MD5_Update, MD5_Final.

package main

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

import (
    "encoding/hex"
    "fmt"
    "strings"
    "unsafe"
)

func main() {
    var ctx C.MD5_CTX
    C.MD5_Init(&ctx)
    data := []byte("https://const.net.cn")
    C.MD5_Update(&ctx, unsafe.Pointer(&data[0]), C.size_t(len(data)))
    md := make([]byte, 16)
    C.MD5_Final((*C.uchar)(unsafe.Pointer(&md[0])), &ctx)
    md5Str := hex.EncodeToString(md)
    md5Str = strings.ToUpper(md5Str)
    fmt.Printf("md5Str = %s\n", md5Str)
}

输出:

go run .
md5Str = 682D2C63236AF6E721794B2988FC1D44
echo -n "https://const.net.cn" | md5sum 
682d2c63236af6e721794b2988fc1d44  -

在golang中使用cgo调用openssl库的md5方法,不使用var定义,使用new来定义C.MD5_CTX

package main

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

import (
    "encoding/hex"
    "fmt"
    "strings"
    "unsafe"
)

func main() {
    ctx := new(C.MD5_CTX)
    C.MD5_Init(ctx)
    data := []byte("const.net.cn")
    C.MD5_Update(ctx, unsafe.Pointer(&data[0]), C.size_t(len(data)))
    md := make([]byte, 16)
    C.MD5_Final((*C.uchar)(unsafe.Pointer(&md[0])), ctx)
    md5Str := hex.EncodeToString(md)
    md5Str = strings.ToUpper(md5Str)
    fmt.Printf("md5Str = %s\n", md5Str)
}

输出:
go run .
md5Str = FA8424A7B72EB90BF04685205ECC5760
echo -n "const.net.cn" | md5sum
fa8424a7b72eb90bf04685205ecc5760 -

crypto包搜集了常用的密码(算法)常量。
使用不同的hash 算法导入不同的包

const (
    MD4         Hash = 1 + iota // import golang.org/x/crypto/md4
    MD5                         // import crypto/md5
    SHA1                        // import crypto/sha1
    SHA224                      // import crypto/sha256
    SHA256                      // import crypto/sha256
    SHA384                      // import crypto/sha512
    SHA512                      // import crypto/sha512
    MD5SHA1                     // no implementation; MD5+SHA1 used for TLS RSA
    RIPEMD160                   // import golang.org/x/crypto/ripemd160
    SHA3_224                    // import golang.org/x/crypto/sha3
    SHA3_256                    // import golang.org/x/crypto/sha3
    SHA3_384                    // import golang.org/x/crypto/sha3
    SHA3_512                    // import golang.org/x/crypto/sha3
    SHA512_224                  // import crypto/sha512
    SHA512_256                  // import crypto/sha512
    BLAKE2s_256                 // import golang.org/x/crypto/blake2s
    BLAKE2b_256                 // import golang.org/x/crypto/blake2b
    BLAKE2b_384                 // import golang.org/x/crypto/blake2b
    BLAKE2b_512                 // import golang.org/x/crypto/blake2b

)

crypto实现md5的示例

package main

import (
    "crypto/md5"
    "fmt"
    "io"
)

func main() {
    fmt.Println("go-crypto/md5 demo.")
    str := "https://const.net.cn"

    data := []byte(str)
    has := md5.Sum(data)
    md5str1 := fmt.Sprintf("%x", has)
    fmt.Println(md5str1)

    str1 := "https://"
    str2 := "const.net.cn"
    w := md5.New()
    io.WriteString(w, str1)
    io.WriteString(w, str2)
    md5str2 := fmt.Sprintf("%x", w.Sum(nil))

    fmt.Println(md5str2)
}

输出:

go run .
go-crypto/md5 demo.
682d2c63236af6e721794b2988fc1d44
682d2c63236af6e721794b2988fc1d44
echo -n "https://const.net.cn" | md5sum 
682d2c63236af6e721794b2988fc1d44  -
echo -n "https://const.net.cn" | openssl dgst -md5
(stdin)= 682d2c63236af6e721794b2988fc1d44

MD4是麻省理工学院教授Ronald Rivest于1990年设计的一种信息摘要算法。它是一种用来测试信息完整性的密码散列函数的实行。其摘要长度为128位。这个算法影响了后来的算法如MD5、SHA家族和RIPEMD等。
1991年Den Boer和Bosselaers发表了一篇文章指出MD4的短处, 2004年8月王小云报告在计算MD4时可能发生杂凑冲撞。
Go 会提示 md4 不建议使用,不安全。

package main

import (
    "crypto/md5"
    "fmt"
    "io"

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

func main() {
    fmt.Println("go md4 demo.")

    str1 := "https://"
    str2 := "const.net.cn"
    w1 := md4.New()
    io.WriteString(w1, str1)
    io.WriteString(w1, str2)

    md4str2 := fmt.Sprintf("%x", w1.Sum(nil))
    fmt.Println(md4str2)

}

输出:

go run .
go md4 demo.
d6dd1d2a616b6a480c6ce417b517734b
echo -n "https://const.net.cn" | openssl dgst -md4
(stdin)= d6dd1d2a616b6a480c6ce417b517734b

SHA-1(英语:Secure Hash Algorithm 1,中文名:安全散列算法1)是一种密码散列函数,美国国家安全局设计,并由美国国家标准技术研究所(NIST)发布为联邦资料处理标准(FIPS)。SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

package main

import (
    "crypto/sha1"
    "fmt"
    "io"
)

func main() {
    fmt.Println("go crypto sha1 demo.")
    str1 := "https://const.net.cn"
    str2 := "/"
    w := sha1.New()
    io.WriteString(w, str1)
    io.WriteString(w, str2)

    sha1str := fmt.Sprintf("%x", w.Sum(nil))
    fmt.Println(sha1str)
}

输出:

go run .
go crypto sha1 demo.
405036731104eeb5fae59f5f600f8b4771d93ac5
echo -n "https://const.net.cn/" | openssl dgst -sha1
(stdin)= 405036731104eeb5fae59f5f600f8b4771d93ac5