security.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package pkg
  2. import (
  3. "encoding/hex"
  4. "math/rand"
  5. "golang.org/x/crypto/scrypt"
  6. )
  7. const (
  8. symbol = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*()-_=+,.?/:;{}[]`~"
  9. letter = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
  10. )
  11. func generateRandString(length int, s string) string {
  12. var chars = []byte(s)
  13. clen := len(chars)
  14. if clen < 2 || clen > 256 {
  15. panic("Wrong charset length for NewLenChars()")
  16. }
  17. maxrb := 255 - (256 % clen)
  18. b := make([]byte, length)
  19. r := make([]byte, length+(length/4)) // storage for random bytes.
  20. i := 0
  21. for {
  22. if _, err := rand.Read(r); err != nil {
  23. panic("Error reading random bytes: " + err.Error())
  24. }
  25. for _, rb := range r {
  26. c := int(rb)
  27. if c > maxrb {
  28. continue // Skip this number to avoid modulo bias.
  29. }
  30. b[i] = chars[c%clen]
  31. i++
  32. if i == length {
  33. return string(b)
  34. }
  35. }
  36. }
  37. }
  38. // GenerateRandomKey20 生成20位随机字符串
  39. func GenerateRandomKey20() string {
  40. return generateRandString(20, symbol)
  41. }
  42. // GenerateRandomKey16 生成16为随机字符串
  43. func GenerateRandomKey16() string {
  44. return generateRandString(16, symbol)
  45. }
  46. // GenerateRandomKey6 生成6为随机字符串
  47. func GenerateRandomKey6() string {
  48. return generateRandString(6, letter)
  49. }
  50. // SetPassword 根据明文密码和加盐值生成密码
  51. func SetPassword(password string, salt string) (verify string, err error) {
  52. var rb []byte
  53. rb, err = scrypt.Key([]byte(password), []byte(salt), 16384, 8, 1, 32)
  54. if err != nil {
  55. return
  56. }
  57. verify = hex.EncodeToString(rb)
  58. return
  59. }