package randomizer import ( "crypto/rand" "math/big" ) var ( ValidChars = []rune("$~!@#%^&*_-+=`|(){}[]:;'<>,.?0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") validSaltChars = []rune("./0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ") ActivationChars = []rune("23456789ABCDEFGHJKLMNPQRSTUVWXYZ") ) // Generate a cryptographically secure random salt func GenerateRandomSalt(length int) (string, error) { salt := make([]rune, length) for i := 0; i < length; i++ { letterIndex, err := rand.Int(rand.Reader, big.NewInt(int64(len(validSaltChars)))) if err != nil { return "", err } salt[i] = validSaltChars[letterIndex.Int64()] } return string(salt), nil } func GenerateRandomBytes(n int) ([]byte, error) { b := make([]byte, n) if _, err := rand.Read(b); err != nil { return nil, err } return b, nil } // Create random plain text password func GenerateRandomPlainPwd(pwdLength int) (string, error) { return generateRandomPhrase(ValidChars, pwdLength) } // Generate password of random length between bounds func RandomPassLength(minLength, maxLength int) (int, error) { pwdLen, err := rand.Int(rand.Reader, big.NewInt(int64(maxLength-minLength))) if err != nil { return -1, err } return int(pwdLen.Int64()) + maxLength, nil } // Create random plain text password func GenerateRandomActivationCode(length int) (string, error) { return generateRandomPhrase(ActivationChars, length) } func generateRandomPhrase(letters []rune, phraseLength int) (string, error) { length := int64(len(letters)) chars := make([]rune, phraseLength) for i := range chars { letterIndex, err := rand.Int(rand.Reader, big.NewInt(length)) if err != nil { return "", err } chars[i] = letters[letterIndex.Int64()] } return string(chars), nil }