12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- package pkg
- import (
- "encoding/hex"
- "math/rand"
- "golang.org/x/crypto/scrypt"
- )
- const (
- symbol = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+,.?/:;{}[]`~"
- letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
- figure = "0123456789"
- )
- func generateRandString(length int, s string) string {
- var chars = []byte(s)
- clen := len(chars)
- if clen < 2 || clen > 256 {
- panic("Wrong charset length for 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)
- }
- // GenerateRandomFigureKey6 生成6为随机数字字符串
- func GenerateRandomFigureKey6() string {
- return generateRandString(6, figure)
- }
- // 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
- }
|