go标准库的学习-crypto/rand
参考:https://studygolang.com/pkgdoc
导入方式:
import "crypto/rand"
rand包实现了用于加解密的更安全的随机数生成器。
Variables
var Reader io.Reader
Reader是一个全局、共享的密码用强随机数生成器。在Unix类型系统中,会从/dev/urandom读取;而Windows中会调用CryptGenRandom API。
举例说明该如何使用Reader:
package main
import(
"fmt"
"encoding/base64"
"crypto/rand"
"io"
) //sessionId函数用来生成一个session ID,即session的唯一标识符
func sessionId() string {
b := make([]byte, )
//ReadFull从rand.Reader精确地读取len(b)字节数据填充进b
//rand.Reader是一个全局、共享的密码用强随机数生成器
if _, err := io.ReadFull(rand.Reader, b); err != nil {
return ""
}
fmt.Println(b) //[62 186 123 16 209 19 130 218 146 136 171 211 12 233 45 99 80 200 59 20 56 254 170 110 59 147 223 177 48 136 220 142]
return base64.URLEncoding.EncodeToString(b)//将生成的随机数b编码后返回字符串,该值则作为session ID
}
func main() {
fmt.Println(sessionId()) //Prp7ENETgtqSiKvTDOktY1DIOxQ4_qpuO5PfsTCI3I4=
}
func Int
func Int(rand io.Reader, max *big.Int) (n *big.Int, err error)
返回一个在[0, max)区间服从均匀分布的随机值,如果max<=0则会panic。
举例:
package main
import(
"fmt"
"crypto/rand"
"math/big"
) func main() {
//从128开始,这样就能够将(max.BitLen() % 8) == 0的情况包含在里面
for n := ; n < ; n++ {
b := new(big.Int).SetInt64(int64(n)) //将new(big.Int)设为int64(n)并返回new(big.Int)
fmt.Printf("max Int is : %v\n", b)
i, err := rand.Int(rand.Reader, b)
if err != nil {
fmt.Printf("Can't generate random value: %v, %v", i, err)
}
fmt.Printf("rand Int is : %v\n", i)
}
}
返回:
bogon:~ user$ go run testGo.go
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
max Int is :
rand Int is :
func Prime
func Prime(rand io.Reader, bits int) (p *big.Int, err error)
返回一个具有指定字位数的数字,该数字具有很高可能性是质数。如果从rand读取时出错,或者bits<2会返回错误。
举例:
package main
import(
"fmt"
"crypto/rand"
) func main() {
for n := ; n < ; n++ {
p, err := rand.Prime(rand.Reader, n) //n代表位数,比如3为2位,127为7位
if err != nil {
fmt.Printf("Can't generate %d-bit prime: %v", n, err)
}
if p.BitLen() != n { //返回p的绝对值的字位数,0的字位数为0
fmt.Printf("%v is not %d-bit", p, n)
}
if !p.ProbablyPrime() { //对p进行32次Miller-Rabin质数检测。如果方法返回真则p是质数的几率为1-(1/4)**32;否则p不是质数
fmt.Printf("%v is not prime", p)
}
fmt.Println(p)
}
}
返回:
bogon:~ user$ go run testGo.go
如果位数小于2的话,会报错:
package main
import(
"fmt"
"crypto/rand"
"log"
) func main() {
p, err := rand.Prime(rand.Reader, ) //n代表位数,比如3为2位,127为7位
if err != nil {
log.Fatal(err)
}
fmt.Println(p)
}
返回:
bogon:~ user$ go run testGo.go
// :: crypto/rand: prime size must be at least -bit
exit status
func Read
func Read(b []byte) (n int, err error)
本函数是一个使用io.ReadFull调用Reader.Read的辅助性函数。当且仅当err == nil时,返回值n == len(b)。
因为本函数是一个使用io.ReadFull调用Reader.Read的辅助性函数,所以最上面的那个生成session ID的例子等价于:
package main
import(
"fmt"
"encoding/base64"
"crypto/rand"
) //sessionId函数用来生成一个session ID,即session的唯一标识符
func sessionId() string {
b := make([]byte, )
//rand.Reader是一个全局、共享的密码用强随机数生成器
n, err := rand.Read(b);
if err != nil {
return ""
}
fmt.Println(b[:n]) //[154 94 244 2 147 96 148 6 13 27 3 52 231 127 160 159 40 47 84 116 79 87 160 217 185 216 47 143 101 107 219 178]
return base64.URLEncoding.EncodeToString(b)//将生成的随机数b编码后返回字符串,该值则作为session ID
}
func main() {
fmt.Println(sessionId()) //ml70ApNglAYNGwM053-gnygvVHRPV6DZudgvj2Vr27I=
}
go标准库的学习-crypto/rand的更多相关文章
- go标准库的学习-crypto/md5
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/md5" md5包实现了MD5哈希算法,参见RFC 1321. Con ...
- go标准库的学习-crypto/sha1
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha1" sha1包实现了SHA1哈希算法,参见RFC 3174. ...
- go标准库的学习-crypto/sha256
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/sha256" sha256包实现了SHA224和SHA256哈希算法 ...
- go标准库的学习-crypto/des
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/des" des包实现了DES标准和TDEA算法,参见U.S. Fed ...
- go标准库的学习-crypto/aes
参考:https://studygolang.com/pkgdoc 导入方式: import "crypto/aes" aes包实现了AES加密算法,参见U.S. Federal ...
- go标准库的学习-net/http
参考:https://studygolang.com/pkgdoc 概念解释: request:用户请求的信息,用来解析用户的请求信息,包括post.get.cookie.url等信息 respons ...
- go标准库的学习-database/sql
参考:https://studygolang.com/pkgdoc 导入方式: import "database/sql" sql包提供了保证SQL或类SQL数据库的泛用接口. 使 ...
- python 标准库基础学习之开发工具部分1学习
#2个标准库模块放一起学习,这样减少占用地方和空间#标准库之compileall字节编译源文件import compileall,re,sys#作用是查找到python文件,并把它们编译成字节码表示, ...
- python calendar标准库基础学习
# -*- coding: utf-8 -*-# 作者:新手__author__ = 'Administrator'#标准库:日期时间基础学习:calendar:处理日期#例1import calen ...
随机推荐
- [转]Angular 2 / 4 / 5 not working in IE11
本文转自:https://stackoverflow.com/questions/35140718/angular-2-4-5-not-working-in-ie11/47777695#4777769 ...
- [转]Entity Framework and slow bulk INSERTs
本文转自:https://weblog.west-wind.com/posts/2013/Dec/22/Entity-Framework-and-slow-bulk-INSERTs I’ve been ...
- 在服务器上搭建wordpress个人博客 php7.2+nginx+mysql+wordperss
买了台VPS,准备搭建一个博客.用过几个博客框架还是觉得Wordpress好用.主题多,插件也非常的便利,而且大多还免费开源.搭建也很简单,其实安装好php+mysql+nginx+wordpress ...
- .net MVC使用Session验证用户登录(转载)
.net MVC使用Session验证用户登录 用最简单的Session方式记录用户登录状态 1.添加DefaultController控制器,重写OnActionExecuting方法,每次访问 ...
- Python全栈学习_day002知识点
今日大纲: . while循环 . 格式化输出 . 运算符 . 编码初识 1. while循环 - while 无限循环: while True: # 死循环 print('大悲咒') print(' ...
- Angular6封装LED时钟数字组件
一.运行截图 截图1: 截图2: 二.代码 html代码: <div class="time" > <ng-container #container> &l ...
- HttpHandler与HttpModule介绍
前言:作为一个开发人员,我们看过很多的关于开发的书,但是都是教我们"知其然",并没有教我们"知其所以然",我们开发web项目的过程中,当我们输完URL敲下回车就 ...
- 微信小程序地图报错——ret is not defined
刚刚在使用微信的map做地图时候 发现如下报错: 后来找了一会发现错误为经纬度写反了导致经纬度超出了范围 正确取值范围: latitude 纬度 浮点数,范围 -90 ~ 90 longitud ...
- 使用 NGINX 流控和 fail2ban 防止 CC 攻击
背景知识 CC 攻击 攻击者通过创建大量请求导致服务器资源耗尽,主要针对特定服务接口,属于实现 DoS 攻击的一种方式(DoS 攻击更多是针对网络端口,而不是具体服务接口). NGINX 流控 lim ...
- 安卓开发_浅谈AsyncTask
现在就来学习一下AsyncTask. 一.先介绍一下AsyncTask: 在开发Android移动客户端的时候往往要使用多线程来进行操作,我们通常会将耗时的操作放在单独的线程执行,避免其占用主线程而给 ...