main.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. package main
  2. import (
  3. "encoding/base64"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "log"
  8. "math/rand"
  9. "time"
  10. "os"
  11. "golang.org/x/crypto/argon2"
  12. )
  13. type UserDef struct {
  14. Name string `json:"name"`
  15. PassSet bool `json:"pass_set"`
  16. Hash string `json:"hash"`
  17. }
  18. type PasswdDef struct {
  19. Admin UserDef `json:"admin"`
  20. }
  21. const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
  22. func RandStringBytes(n int) string {
  23. rand.Seed(time.Now().UnixNano())
  24. b := make([]byte, n)
  25. for i := range b {
  26. b[i] = letterBytes[rand.Intn(len(letterBytes))] // It's not safe for password purpose, but i'm lazy.
  27. }
  28. return string(b)
  29. }
  30. func main() {
  31. var password string = os.Getenv("ZTNCUI_PASSWD")
  32. if len(password) < 2 {
  33. log.Println("Current Password: " + password + " is too weak or not set...")
  34. password = RandStringBytes(10)
  35. }
  36. log.Println("Current Password: " + password)
  37. var ag2_memory uint32 = 4096
  38. var ag2_iter uint32 = 3
  39. var ag2_para uint8 = 1
  40. var ag2_saltlen uint8 = 16
  41. var ag2_hashlen uint32 = 32
  42. ag2_salt := make([]byte, ag2_saltlen)
  43. _, err := rand.Read(ag2_salt)
  44. if err != nil {
  45. log.Fatal(err)
  46. }
  47. ag2_hash := argon2.Key([]byte(password), ag2_salt, ag2_iter, ag2_memory, ag2_para, ag2_hashlen)
  48. ag2_saltb64 := base64.RawStdEncoding.EncodeToString(ag2_salt)
  49. ag2_hashb64 := base64.RawStdEncoding.EncodeToString(ag2_hash)
  50. finalhash := fmt.Sprintf("$argon2i$v=%d$m=%d,t=%d,p=%d$%s$%s", argon2.Version, ag2_memory, ag2_iter, ag2_para, ag2_saltb64, ag2_hashb64)
  51. u1 := UserDef{
  52. Name: "admin",
  53. PassSet: false,
  54. Hash: finalhash,
  55. }
  56. p1 := PasswdDef{
  57. Admin: u1,
  58. }
  59. v1, err := json.Marshal(p1)
  60. if err != nil {
  61. log.Fatal(err)
  62. }
  63. err = ioutil.WriteFile("passwd", v1, 0644)
  64. if err != nil {
  65. log.Fatal(err)
  66. }
  67. log.Println("Generate Done, check passwd file.")
  68. }