forked from go-admin-team/go-admin-core
/
security.go
67 lines (59 loc) · 1.51 KB
/
security.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package pkg
import (
"encoding/hex"
"math/rand"
"golang.org/x/crypto/scrypt"
)
const (
symbol = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+,.?/:;{}[]`~"
letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
)
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)
}
// 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
}