package pkg import ( "encoding/hex" "math/rand" "golang.org/x/crypto/scrypt" ) const ( symbol = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+,.?/:;{}[]`~" letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" number = "0123456789" ) func generateRandString(length int, s string) string { var chars = []byte(s) clen := len(chars) if clen < 2 || clen > 256 { panic("字符集长度错误 NewLenChars()") } maxRb := 255 - (256 % clen) b := make([]byte, length) r := make([]byte, length+(length/4)) // storage for random bytes. i := 0 for { if _, err := rand.Read(r); err != nil { panic("Error reading random bytes: " + err.Error()) } for _, rb := range r { c := int(rb) if c > maxRb { continue // Skip this number to avoid modulo bias. } b[i] = chars[c%clen] i++ if i == length { return string(b) } } } } // GenerateRandomKey20 生成20位随机字符串 func GenerateRandomKey20() string { return generateRandString(20, symbol) } // GenerateRandomKey16 生成16为随机字符串 func GenerateRandomKey16() string { return generateRandString(16, symbol) } // GenerateRandomKey6 生成6为随机字符串 func GenerateRandomKey6() string { return generateRandString(6, letter) } // GenerateRandomKey4 生成4为随机字符串 func GenerateRandomKey4() string { return generateRandString(4, number) } func GenerateRandomSymbol(length int) string { return generateRandString(length, symbol) } func GenerateRandomLetter(length int) string { return generateRandString(length, letter) } func GenerateRandomNumber(length int) string { return generateRandString(length, number) } // SetPassword 根据明文密码和加盐值生成密码 func SetPassword(password string, salt string) (verify string, err error) { var rb []byte rb, err = scrypt.Key([]byte(password), []byte(salt), 16384, 8, 1, 32) if err != nil { return } verify = hex.EncodeToString(rb) return }