• 12.12 Go 中的密码学

    12.12 Go 中的密码学

    通过网络传输的数据必须加密,以防止被 hacker(黑客)读取或篡改,并且保证发出的数据和收到的数据检验和一致。
    鉴于 Go 母公司的业务,我们毫不惊讶地看到 Go 的标准库为该领域提供了超过 30 个的包:

    • hash 包:实现了 adler32crc32crc64fnv 校验;
    • crypto 包:实现了其它的 hash 算法,比如 md4md5sha1 等。以及完整地实现了 aesblowfishrc4rsaxtea 等加密算法。

    下面的示例用 sha1md5 计算并输出了一些校验值。

    示例 12.20 hash_sha1.go:

    1. // hash_sha1.go
    2. package main
    3. import (
    4. "fmt"
    5. "crypto/sha1"
    6. "io"
    7. "log"
    8. )
    9. func main() {
    10. hasher := sha1.New()
    11. io.WriteString(hasher, "test")
    12. b := []byte{}
    13. fmt.Printf("Result: %x\n", hasher.Sum(b))
    14. fmt.Printf("Result: %d\n", hasher.Sum(b))
    15. //
    16. hasher.Reset()
    17. data := []byte("We shall overcome!")
    18. n, err := hasher.Write(data)
    19. if n!=len(data) || err!=nil {
    20. log.Printf("Hash write error: %v / %v", n, err)
    21. }
    22. checksum := hasher.Sum(b)
    23. fmt.Printf("Result: %x\n", checksum)
    24. }

    输出:

    1. Result: a94a8fe5ccb19ba61c4c0873d391e987982fbbd3
    2. Result: [169 74 143 229 204 177 155 166 28 76 8 115 211 145 233 135 152 47 187 211]
    3. Result: e2222bfc59850bbb00a722e764a555603bb59b2a

    通过调用 sha1.New() 创建了一个新的 hash.Hash 对象,用来计算 SHA1 校验值。Hash 类型实际上是一个接口,它实现了 io.Writer 接口:

    1. type Hash interface {
    2. // Write (via the embedded io.Writer interface) adds more data to the running hash.
    3. // It never returns an error.
    4. io.Writer
    5. // Sum appends the current hash to b and returns the resulting slice.
    6. // It does not change the underlying hash state.
    7. Sum(b []byte) []byte
    8. // Reset resets the Hash to its initial state.
    9. Reset()
    10. // Size returns the number of bytes Sum will return.
    11. Size() int
    12. // BlockSize returns the hash's underlying block size.
    13. // The Write method must be able to accept any amount
    14. // of data, but it may operate more efficiently if all writes
    15. // are a multiple of the block size.
    16. BlockSize() int
    17. }

    通过 io.WriteString 或 hasher.Write 将给定的 []byte 附加到当前的 hash.Hash 对象中。

    练习 12.9:hash_md5.go:

    在示例 12.20 中检验 md5 算法。