Go - 关于加密/兰特的例子

use*_*368 1 random cryptography go

可以举一个关于使用crypto/rand[1]的小例子吗?

该函数Read有一个字节数组作为参数。为什么?如果它访问/dev/urandom以获取随机数据。

func Read(b []byte) (n int, err os.Error)
Run Code Online (Sandbox Code Playgroud)

[1] http://golang.org/pkg/crypto/rand/

pet*_*rSO 6

func Read(b []byte) (n int, err os.Error)
Run Code Online (Sandbox Code Playgroud)

Read是一个辅助函数,调用Reader.Read. Reader定义为:var Reader io.Reader

加密/兰特/

io.Reader是包装基本Read方法的接口。

Read最多读取len(p)字节到p. 它返回读取的字节数 ( 0 <= n <= len(p)) 和遇到的任何错误。即使Read返回n < len(p),它也可能p在调用期间使用所有作为暂存空间。如果某些数据可用但不是len(p)字节,则Read通常返回可用的数据,而不是阻塞等待更多数据。

在输入流的末尾,Read返回0, os.EOFRead可能会返回非零字节数且nil无错误。特别是Read,耗尽输入的 a 可能返回 n > 0, os.EOF

type Reader interface {
    Read(p []byte) (n int, err os.Error)
}
Run Code Online (Sandbox Code Playgroud)

io/#读者

例如,要读取前 16 个随机字节,

package main

import (
    "fmt"
    "crypto/rand"
)

func main() {
    b := make([]byte, 16)
    n, err := rand.Read(b)
    fmt.Println(n, err, b)
}
Run Code Online (Sandbox Code Playgroud)

使用包init()函数,crypto/rand默认使用/dev/urandom.

// Easy implementation: read from /dev/urandom.
// This is sufficient on Linux, OS X, and FreeBSD.
func init() { Reader = &devReader{name: "/dev/urandom"} }
Run Code Online (Sandbox Code Playgroud)

加密/兰特/rand.go

  • 因为 newReader 和 devReader 没有被导出,所以 /dev/urandom 总是被有效地使用。 (2认同)