最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang如何構(gòu)造最佳隨機(jī)密碼詳解

 更新時(shí)間:2023年01月04日 15:00:54   作者:夢(mèng)想畫(huà)家  
人們往往有使用同一密碼的習(xí)慣,為了防止數(shù)據(jù)庫(kù)意外泄露/破壞和出于保護(hù)用戶(hù)隱私的目的,下面這篇文章主要給大家介紹了關(guān)于Golang如何構(gòu)造最佳隨機(jī)密碼的相關(guān)資料,需要的朋友可以參考下

為了保護(hù)系統(tǒng)或數(shù)據(jù)安全,我們需要最佳隨機(jī)密碼。這里使用unix系統(tǒng)定義的文件設(shè)備/dev/random,從中獲取隨機(jī)數(shù)生成器的種子。

需求說(shuō)明

定義程序goodPass.go,程序需要一個(gè)可選命令行參數(shù),指定生成密碼的長(zhǎng)度,缺省長(zhǎng)度為10. 另外生成密碼的ASCII從!z,對(duì)應(yīng)ascii碼為33到122。

程序第一部分是導(dǎo)入相應(yīng)的包:

package main

import (
	"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函數(shù)生成一定范圍內(nèi)的,Intn()結(jié)果不包括末端數(shù)值。下面實(shí)現(xiàn)main函數(shù),處理命令行參數(shù),并從隨機(jī)文件設(shè)備中獲取隨機(jī)種子:

func main() {
	var LENGTH int64 = 10
	if 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)
}

首先處理命令行參數(shù),如果沒(méi)有指定長(zhǎng)度,則取默認(rèn)值10,否則解析命令行參數(shù)。

然后打開(kāi)/dev/random 設(shè)備進(jìn)行讀取,這里使用binary.Read是需要指定字節(jié)順序(binary.LittleEndian),這是為了構(gòu)建int64類(lèi)型,而不是獲得一串字節(jié)。這里為了展示如何從二進(jìn)制文件讀內(nèi)容至Go類(lèi)型。

binary.Read(f, binary.LittleEndian, &seed) 函數(shù)的源碼注釋為:

// 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 int64
	for i = 0; i < LENGTH; i++ {
		anInt := random(MIN, MAX)
		newChar := string(startChar[0] + byte(anInt))
		if newChar == " " {
			i = i - i
			continue
		}
		fmt.Print(newChar)
	}
	fmt.Println()
}

我們看到Go處理Ascii字符有點(diǎn)奇怪,這是因?yàn)镚o默認(rèn)支持Unicode字符。因此需要轉(zhuǎn)換整數(shù)值ascii字符,對(duì)應(yīng)代碼為:

newChar := string(startChar[0] + byte(anInt))

運(yùn)行程序,生成下列輸出:

$ 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

總結(jié)

到此這篇關(guān)于Golang如何構(gòu)造最佳隨機(jī)密碼的文章就介紹到這了,更多相關(guān)Golang最佳隨機(jī)密碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go一站式配置管理工具Viper的使用教程

    Go一站式配置管理工具Viper的使用教程

    Viper是一個(gè)方便Go語(yǔ)言應(yīng)用程序處理配置信息的庫(kù),它可以處理多種格式的配置,這篇文章主要為大家介紹了它的具體使用教程,需要的可以參考下
    2023-08-08
  • 解決Go?Json?Unmarshal反序列化丟失數(shù)字精度問(wèn)題

    解決Go?Json?Unmarshal反序列化丟失數(shù)字精度問(wèn)題

    業(yè)務(wù)會(huì)使用?id生成器?產(chǎn)生的?分布式唯一ID,長(zhǎng)度比較長(zhǎng),所以代碼反序列化時(shí),會(huì)出現(xiàn)精度丟失問(wèn)題,那如何解決呢,下面小編就來(lái)和大家詳細(xì)講講
    2023-08-08
  • Go設(shè)計(jì)模式之代理模式圖文詳解

    Go設(shè)計(jì)模式之代理模式圖文詳解

    這篇文章將通過(guò)圖文講解給大家詳細(xì)的介紹一下Go代理模式,代理模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,代理控制著對(duì)于原對(duì)象的訪問(wèn), 并允許在將請(qǐng)求提交給對(duì)象前后進(jìn)行一些處理,感興趣的同學(xué)跟著小編一起來(lái)看看吧
    2023-07-07
  • 一文帶你了解Go語(yǔ)言中的指針和結(jié)構(gòu)體

    一文帶你了解Go語(yǔ)言中的指針和結(jié)構(gòu)體

    前面的兩篇文章對(duì)?Go?語(yǔ)言的基礎(chǔ)語(yǔ)法和基本數(shù)據(jù)類(lèi)型以及幾個(gè)復(fù)合數(shù)據(jù)類(lèi)型進(jìn)行介紹,本文將對(duì)?Go?里面的指針和結(jié)構(gòu)體進(jìn)行介紹,也為后續(xù)文章做鋪墊,感興趣的可以了解一下
    2022-11-11
  • golang 中strings包的Replace的使用說(shuō)明

    golang 中strings包的Replace的使用說(shuō)明

    這篇文章主要介紹了golang 中strings包的Replace的使用說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Go Plugins插件的實(shí)現(xiàn)方式

    Go Plugins插件的實(shí)現(xiàn)方式

    目前 Plugins 僅在 Linux、FreeBSD 和 macOS 上受支持,且只支持 golang 調(diào)用,今天通過(guò)本文給大家介紹Go Plugins插件的實(shí)現(xiàn)方式,感興趣的朋友一起看看吧
    2021-08-08
  • golang-切片slice的創(chuàng)建方式

    golang-切片slice的創(chuàng)建方式

    這篇文章主要介紹了golang-切片slice的創(chuàng)建方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04
  • Go語(yǔ)言中實(shí)現(xiàn)Unix風(fēng)格的進(jìn)程管道方法實(shí)例

    Go語(yǔ)言中實(shí)現(xiàn)Unix風(fēng)格的進(jìn)程管道方法實(shí)例

    這篇文章主要為大家介紹了Go語(yǔ)言中實(shí)現(xiàn)Unix風(fēng)格的進(jìn)程管道方法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • Golang實(shí)現(xiàn)Json轉(zhuǎn)結(jié)構(gòu)體的示例詳解

    Golang實(shí)現(xiàn)Json轉(zhuǎn)結(jié)構(gòu)體的示例詳解

    這篇文章主要為大家詳細(xì)介紹了Golang實(shí)現(xiàn)Json轉(zhuǎn)結(jié)構(gòu)體的方法,文中的示例代碼講解詳細(xì),對(duì)學(xué)習(xí)Go語(yǔ)言有一定的幫助,需要的可以參考一下
    2023-02-02
  • Go結(jié)合Redis用最簡(jiǎn)單的方式實(shí)現(xiàn)分布式鎖

    Go結(jié)合Redis用最簡(jiǎn)單的方式實(shí)現(xiàn)分布式鎖

    本文主要介紹了Go結(jié)合Redis用最簡(jiǎn)單的方式實(shí)現(xiàn)分布式鎖示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01

最新評(píng)論

湛江市| 浮山县| 宁津县| 桂林市| 连城县| 万山特区| 襄樊市| 历史| 英吉沙县| 安阳县| 威远县| 马山县| 全州县| 平远县| 吴川市| 肥东县| 廊坊市| 垫江县| 舒城县| 陈巴尔虎旗| 吴忠市| 翁牛特旗| 石泉县| 博白县| 泗阳县| 正宁县| 黑河市| 克拉玛依市| 金塔县| 海丰县| 邢台市| 西峡县| 四子王旗| 文山县| 上饶县| 阿坝| 都江堰市| 宽甸| 柳江县| 崇左市| 同德县|