如何在Golang中生成一个长度可变的密码学安全随机字符串

330 阅读1分钟

如果你想创建一个长度可变的加密安全或非安全的随机字符串,你可以使用下面的例子。

密码学安全版本

package main

import (
	"crypto/rand"
	"log"
)

const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

func main() {
	ran, err := random(10)
	if err != nil {
		log.Fatalln(err)
	}

	log.Println(ran)
}

func random(length int) (string, error) {
	bytes := make([]byte, length)

	if _, err := rand.Read(bytes); err != nil {
		return "", err
	}

	for i, b := range bytes {
		bytes[i] = chars[b%byte(len(chars))]
	}

	return string(bytes), nil
}

测试

# 10
r8khqsyt7E

# 100
WwB3qqFWbRol9tzBs1859jiqqtC8HZgayOw20PxOQLltlQ4CGkkqnt6Un5Ej5Sk5MIBnrH619rtCvU7i7xqz2523M1qvJ1I11skg

非安全版本 - 1

package random

import (
	"math/rand"
	"time"
)

const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

func String(length int) (string, error) {
	rand.Seed(time.Now().UnixNano())
	
	bytes := make([]byte, length)

	_, err := rand.Read(bytes)
	if err != nil {
		return "", err
	}

	for k, v := range bytes {
		bytes[k] = chars[v%byte(len(chars))]
	}

	return string(bytes), nil
}

测试

# 10
uhPv8zBz1K

# 100
k547x6Dhm1xfuAtQpEdfg30fZ147nEcb59suGtdanLu0mXVhEooayMo8A7FVa3HtNxoE984vbVc0UD8LpPsBSXj0C7KqPa7TxZbN

非安全版本--2

package random

import (
	"math/rand"
	"time"
)

var chars = []rune("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")

func String(length int) string {
	rand.Seed(time.Now().UnixNano())

	pick := make([]rune, length)
	for i := range pick {
		pick[i] = chars[rand.Intn(len(chars))]
	}

	return string(pick)
}

测试

# 10
57fCgGTwQf

# 100
Mu1gbzW3N5kQNHDL5yZN4WJNH0zyWUWw8UYiVGgAaNjSGyyRyG1cTz1MISIMT31IyG0tn5ADIpOucko5BfjkdUdvqgKDmDKT7Xsg