Golang 构造最佳随机密码
为了保护系统或数据安全,我们需要最佳随机密码。这里使用unix系统定义的文件设备/dev/random
,从中获取随机数生成器的种子。
需求说明
定义程序goodPass.go,程序需要一个可选命令行参数,指定生成密码的长度,缺省长度为10. 另外生成密码的ASCII从!
到z
,对应ascii码为33到122。
程序第一部分是导入相应的包:
package mainimport ("encoding/binary""fmt""math/rand""os""path/filepath""strconv"
)var MAX = 90
var MIN = 0// Intn returns, as an int, a non-negative pseudo-random number in the half-open interval [0,n)
// from the default Source.
// It panics if n <= 0.
func random(min, max int) int {return rand.Intn(max-min) + min
}
这里radmon函数生成一定范围内的,Intn()结果不包括末端数值。下面实现main函数,处理命令行参数,并从随机文件设备中获取随机种子:
func main() {var LENGTH int64 = 10if len(os.Args) != 2 {fmt.Printf("usage: %s length\n", filepath.Base(os.Args[0]))//os.Exit(1)fmt.Printf("Default length is %d\n", LENGTH)} else {LENGTH, _ = strconv.ParseInt(os.Args[1], 10, 64)}f, _ := os.Open("/dev/random")var seed int64_ = binary.Read(f, binary.LittleEndian, &seed)_ = f.Close()rand.Seed(seed)fmt.Println("Seed:", seed)GenPass(LENGTH)
}
首先处理命令行参数,如果没有指定长度,则取默认值10,否则解析命令行参数。
然后打开/dev/random
设备进行读取,这里使用binary.Read
是需要指定字节顺序(binary.LittleEndian),这是为了构建int64类型,而不是获得一串字节。这里为了展示如何从二进制文件读内容至Go类型。
binary.Read(f, binary.LittleEndian, &seed) 函数的源码注释为:
// Read reads structured binary data from r into data.
// Data must be a pointer to a fixed-size value or a slice of fixed-size values.
// Bytes read from r are decoded using the specified byte order and written to successive fields of the data.
// When decoding boolean values, a zero byte is decoded as false, and any other non-zero byte is decoded as true.
最后一部分代码为:
func GenPass(LENGTH int64) {startChar := "!"var i int64for i = 0; i < LENGTH; i++ {anInt := random(MIN, MAX)newChar := string(startChar[0] + byte(anInt))if newChar == " " {i = i - icontinue}fmt.Print(newChar)}fmt.Println()
}
我们看到Go处理Ascii字符有点奇怪,这是因为Go默认支持Unicode字符。因此需要转换整数值ascii字符,对应代码为:
newChar := string(startChar[0] + byte(anInt))
运行程序,生成下列输出:
$ go run goodPass.go 1
Seed: -5195038511418503382
b$ go run goodPass.go 10
Seed: 8492864627151568776
k43Ve`+YD)$ go run goodPass.go 50
Seed: -4276736612056007162
!=Gy+;XV>6eviuR=ST\u:Mk4Q875Y4YZiZhq&q_4Ih/]''`2:x
Golang 构造最佳随机密码相关推荐
- Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践
博文作者:迦壹 博客地址:Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践 转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作! 1.Ra ...
- 数据结构(八):排序 | 插入排序 | 希尔排序 | 冒泡排序 | 快速排序 | 简单选择排序 | 堆排序 | 归并排序 | 基数排序 | 外部排序 | 败者树 | 置换-选择排序 | 最佳归并树
文章目录 第八章 排序 一.排序的基本概念 (一)什么是排序 (二)排序的应用 (三)排序算法的评价指标 (四)排序算法的分类 (五)总结 二.插入排序 (一)算法思想 (二)算法实现 (三)算法效率 ...
- 平方逼近matlab,MATLAB上机实验——最佳平方逼近
<MATLAB上机实验--最佳平方逼近>由会员分享,可在线阅读,更多相关<MATLAB上机实验--最佳平方逼近(5页珍藏版)>请在人人文库网上搜索. 1.任务:用MATLAB语 ...
- 【外排序】外排序算法(磁盘排序、磁带排序) 外存设备结构分析 败者树多路归并 最佳归并树白话讲解
外排序 外排序概述 外排序的基本方法是归并排序法 例子 总结 存储设备(可忽略) 磁带 磁带结构 磁盘 硬盘结构 块 硬盘上的数据定位 磁盘排序 磁盘排序过程 1.生成初始顺串 方法1(常规方法): ...
- MQ对比之RabbitMQ Redis
消息队列选择:RabbitMQ & Redis RabbitMQ RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现的产品,Rabb ...
- 合成孔径成像算法与实现_声呐二维成像技术
前 言 波束形成声成像技术是一种被广泛使用的声成像技术,波束形成技术是波束形成声成像系统中的重要组成部分,波束形成的好坏将直接影响到最终生成的图像质量.发展较早的主要是二维成像声呐,如侧扫声呐.前视声 ...
- Python爬虫实战六之抓取爱问知识人问题并保存至数据库
大家好,本次为大家带来的是抓取爱问知识人的问题并将问题和答案保存到数据库的方法,涉及的内容包括: Urllib的用法及异常处理 Beautiful Soup的简单应用 MySQLdb的基础用法 正则表 ...
- 《程序是怎么跑起来的》第六章
这一章主要讲的是文件的压缩.文件是将数据存储在磁盘等存储媒介中的一种形式,程序文件中存储数据的单位是字节,文件就是字节数据的结合. 还有讲了RLE算法,图像文件本质上也是字节数据的结合体,还有就是,R ...
- 语义分析 文本矛盾点解析_关于解析文本的几点思考
语义分析 文本矛盾点解析 Yesterday I wrote about three course modules in Oslo, and the fact that most of the pre ...
最新文章
- Ionic 4.3.0 发布,移动应用开发框架
- Java泛型中? 和 ? extends Object的异同分析
- 计算机视觉与深度学习算法工程师面试题整理
- jstl核心标签使用
- “error LNK1169: 找到一个或多个多重定义的符号”的解决方法
- Delphi编程禁止用户关闭操作系统
- LeetCode MySQL 1633. 各赛事的用户注册率
- 一文讲清,MySQL事务隔离级别
- 数学建模、统计学之方差分析
- html css周志,【嘉兴东臣php】HTML+CSS+JS周总结
- 企业中常见的推荐系统架构(附交流视频和PPT下载链接)
- 《ETL原理及应用》学习笔记 ·004【kettle的使用-2】
- 解决POI大数据导出Excel内存溢出、应用假死
- vue 调用移动录像_vue调用摄像头拍照 (移动)2020-11-18
- 05笔记 离散数学——函数——基于离散数学(第3版)_章炯民,陶增乐
- linux系统改键盘系统,Linux 修改键盘设置
- ​杭州阿里、海康、网易等组成 HR 联盟,以后你还敢跳槽吗?
- 朝花夕拾 —— 重温《花田半亩》
- php model module,Yii2用Gii自动生成Module+Model+CRUD
- 【安价】亚拉奈夫想要复兴贫弱男爵家的样子【内政】2
热门文章
- 几种通信方式介绍(一)————串行通信技术介绍
- python3.6升级3.8后,强行安装PyGObject发生“俄罗斯套娃”
- 【软考】系统集成项目管理工程师(十三)项目干系人管理
- C语言平面几何7-直线与圆的位置关系
- Android之高仿墨迹天气桌面组件(AppWidgetProvider) .
- 设置CentOS防火墙开放端口
- 计算机电池的性能参数,基于51单片机的蓄电池性能测试仪的设计.doc
- 自己动手写Docker学习笔记
- 我的理想600字作文计算机方面,我的理想600字作文「8篇」
- Python-自动化办公1