1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- package main
- import (
- "encoding/base64"
- "encoding/json"
- "fmt"
- "io/ioutil"
- "log"
- "math/rand"
- "time"
- "os"
- "golang.org/x/crypto/argon2"
- )
- type UserDef struct {
- Name string `json:"name"`
- PassSet bool `json:"pass_set"`
- Hash string `json:"hash"`
- }
- type PasswdDef struct {
- Admin UserDef `json:"admin"`
- }
- const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
- func RandStringBytes(n int) string {
- rand.Seed(time.Now().UnixNano())
- b := make([]byte, n)
- for i := range b {
- b[i] = letterBytes[rand.Intn(len(letterBytes))] // It's not safe for password purpose, but i'm lazy.
- }
- return string(b)
- }
- func main() {
- var password string = os.Getenv("ZTNCUI_PASSWD")
- if len(password) < 2 {
- log.Println("Current Password: " + password + " is too weak or not set...")
- password = RandStringBytes(10)
- }
- log.Println("Current Password: " + password)
-
- var ag2_memory uint32 = 4096
- var ag2_iter uint32 = 3
- var ag2_para uint8 = 1
- var ag2_saltlen uint8 = 16
- var ag2_hashlen uint32 = 32
- ag2_salt := make([]byte, ag2_saltlen)
- _, err := rand.Read(ag2_salt)
- if err != nil {
- log.Fatal(err)
- }
- ag2_hash := argon2.Key([]byte(password), ag2_salt, ag2_iter, ag2_memory, ag2_para, ag2_hashlen)
- ag2_saltb64 := base64.RawStdEncoding.EncodeToString(ag2_salt)
- ag2_hashb64 := base64.RawStdEncoding.EncodeToString(ag2_hash)
- 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)
- u1 := UserDef{
- Name: "admin",
- PassSet: false,
- Hash: finalhash,
- }
- p1 := PasswdDef{
- Admin: u1,
- }
- v1, err := json.Marshal(p1)
- if err != nil {
- log.Fatal(err)
- }
- err = ioutil.WriteFile("passwd", v1, 0644)
- if err != nil {
- log.Fatal(err)
- }
- log.Println("Generate Done, check passwd file.")
- }
|