1
0
mirror of https://github.com/Luzifer/password.git synced 2024-09-19 18:32:57 +00:00
password/lib/xkcd.go
Knut Ahlers cb3fd042e1
Add XKCD style password generator
Signed-off-by: Knut Ahlers <knut@ahlers.me>
2017-10-31 12:10:24 +01:00

57 lines
1.3 KiB
Go

package securepassword
import (
"errors"
"math/rand"
"strings"
"time"
"github.com/Luzifer/go_helpers/str"
)
type XKCD struct{}
var (
// ErrTooFewWords represents an error thrown if the password will
// have fewer than four words and are not considered to be safe
ErrTooFewWords = errors.New("XKCD passwords with less than 4 words makes no sense")
// DefaultXKCD contains an default instance of the XKCD password
// generator
DefaultXKCD = NewXKCDGenerator()
)
// NewXKCDGenerator initializes a new XKCD password generator
// https://xkcd.com/936/
func NewXKCDGenerator() *XKCD { return &XKCD{} }
// GeneratePassword generates a password with the number of words
// given and optionally the current date prepended
func (x XKCD) GeneratePassword(length int, addDate bool) (string, error) {
if length < 4 {
return "", ErrTooFewWords
}
var (
password string
usedWords []string
)
if addDate {
password = time.Now().Format("20060102.")
}
rand.Seed(time.Now().UnixNano())
for len(usedWords) < length {
word := strings.Title(xkcdWordList[rand.Intn(len(xkcdWordList))])
if str.StringInSlice(word, usedWords) {
// Don't use a word twice
continue
}
password = password + word
usedWords = append(usedWords, word)
}
return password, nil
}