security.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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. number = "0123456789"
  11. )
  12. func generateRandString(length int, s string) string {
  13. var chars = []byte(s)
  14. clen := len(chars)
  15. if clen < 2 || clen > 256 {
  16. panic("字符集长度错误 NewLenChars()")
  17. }
  18. maxRb := 255 - (256 % clen)
  19. b := make([]byte, length)
  20. r := make([]byte, length+(length/4)) // storage for random bytes.
  21. i := 0
  22. for {
  23. if _, err := rand.Read(r); err != nil {
  24. panic("Error reading random bytes: " + err.Error())
  25. }
  26. for _, rb := range r {
  27. c := int(rb)
  28. if c > maxRb {
  29. continue // Skip this number to avoid modulo bias.
  30. }
  31. b[i] = chars[c%clen]
  32. i++
  33. if i == length {
  34. return string(b)
  35. }
  36. }
  37. }
  38. }
  39. // GenerateRandomKey20 生成20位随机字符串
  40. func GenerateRandomKey20() string {
  41. return generateRandString(20, symbol)
  42. }
  43. // GenerateRandomKey16 生成16为随机字符串
  44. func GenerateRandomKey16() string {
  45. return generateRandString(16, symbol)
  46. }
  47. // GenerateRandomKey6 生成6为随机字符串
  48. func GenerateRandomKey6() string {
  49. return generateRandString(6, letter)
  50. }
  51. // GenerateRandomKey4 生成4为随机字符串
  52. func GenerateRandomKey4() string {
  53. return generateRandString(4, number)
  54. }
  55. func GenerateRandomSymbol(length int) string {
  56. return generateRandString(length, symbol)
  57. }
  58. func GenerateRandomLetter(length int) string {
  59. return generateRandString(length, letter)
  60. }
  61. func GenerateRandomNumber(length int) string {
  62. return generateRandString(length, number)
  63. }
  64. // SetPassword 根据明文密码和加盐值生成密码
  65. func SetPassword(password string, salt string) (verify string, err error) {
  66. var rb []byte
  67. rb, err = scrypt.Key([]byte(password), []byte(salt), 16384, 8, 1, 32)
  68. if err != nil {
  69. return
  70. }
  71. verify = hex.EncodeToString(rb)
  72. return
  73. }