64 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			64 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
|  | package crypto | |||
|  | 
 | |||
|  | import ( | |||
|  | 	"crypto/rand" | |||
|  | 	"encoding/hex" | |||
|  | 	"io" | |||
|  | 	mathrand "math/rand" | |||
|  | 	"strconv" | |||
|  | 	"time" | |||
|  | ) | |||
|  | 
 | |||
|  | // 生成AES-128密钥的函数,符合市面规范 | |||
|  | func GenerateSecretKey() (string, error) { | |||
|  | 	key := make([]byte, 16) // 16字节密钥 | |||
|  | 	_, err := io.ReadFull(rand.Reader, key) | |||
|  | 	if err != nil { | |||
|  | 		return "", err | |||
|  | 	} | |||
|  | 	return hex.EncodeToString(key), nil | |||
|  | } | |||
|  | 
 | |||
|  | func GenerateSecretId() (string, error) { | |||
|  | 	// 创建一个字节数组,用于存储随机数据 | |||
|  | 	bytes := make([]byte, 8) // 因为每个字节表示两个16进制字符 | |||
|  | 
 | |||
|  | 	// 读取随机字节到数组中 | |||
|  | 	_, err := rand.Read(bytes) | |||
|  | 	if err != nil { | |||
|  | 		return "", err | |||
|  | 	} | |||
|  | 
 | |||
|  | 	// 将字节数组转换为16进制字符串 | |||
|  | 	return hex.EncodeToString(bytes), nil | |||
|  | } | |||
|  | 
 | |||
|  | // GenerateTransactionID 生成16位数的交易单号 | |||
|  | func GenerateTransactionID() string { | |||
|  | 	length := 16 | |||
|  | 	// 获取当前时间戳 | |||
|  | 	timestamp := time.Now().UnixNano() | |||
|  | 
 | |||
|  | 	// 转换为字符串 | |||
|  | 	timeStr := strconv.FormatInt(timestamp, 10) | |||
|  | 
 | |||
|  | 	// 生成随机数 | |||
|  | 	mathrand.Seed(time.Now().UnixNano()) | |||
|  | 	randomPart := strconv.Itoa(mathrand.Intn(1000000)) | |||
|  | 
 | |||
|  | 	// 组合时间戳和随机数 | |||
|  | 	combined := timeStr + randomPart | |||
|  | 
 | |||
|  | 	// 如果长度超出指定值,则截断;如果不够,则填充随机字符 | |||
|  | 	if len(combined) >= length { | |||
|  | 		return combined[:length] | |||
|  | 	} | |||
|  | 
 | |||
|  | 	// 如果长度不够,填充0 | |||
|  | 	for len(combined) < length { | |||
|  | 		combined += strconv.Itoa(mathrand.Intn(10)) // 填充随机数 | |||
|  | 	} | |||
|  | 
 | |||
|  | 	return combined | |||
|  | } |