125 lines
5.0 KiB
Go
125 lines
5.0 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"math/rand"
|
|
"strings"
|
|
"time"
|
|
"github.com/nbutton23/zxcvbn-go"
|
|
)
|
|
|
|
var alpha = []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y",
|
|
"z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z",
|
|
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9"}
|
|
|
|
var whitespace = []string{".", "!", "+", "-", "_", "*"}
|
|
|
|
var numbers = []string{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "C", "X", "V", "F", "Q", "Z", "N"}
|
|
|
|
var left = []string{"Alabama", "Alaska", "Arizona", "Maryland", "Nevada", "Mexico", "Texas", "Utah", "Glasgow", "Inverness", "Edinburgh", "Dumbarton",
|
|
"Balloch", "Renton", "Cardross", "Dundee", "Paisley",
|
|
"Hamilton", "Greenock", "Falkirk",
|
|
"Irvine",
|
|
"Renfrew",
|
|
"Erskine",
|
|
"London",
|
|
"Hammersmith",
|
|
"Islington",
|
|
"Silver", "Black", "Yellow", "Purple", "White", "Pink", "Red", "Orange", "Brown", "Green", "Blue", "Amber", "Aqua",
|
|
"Azure", "Bronze", "Coral", "Copper", "Crimson", "Cyan", "Ginger", "Gold", "Indigo", "Jade", "Ruby", "Cedar", "Cream", "Peach", "Sepcia",
|
|
|
|
"Mercyful", "Cyber", "Ultra", "Hunter", "Electric", "Steel", "Fire", "Smoke", "Thunder", "Pewter", "Stone", "Iron", "Shadow", "Grey", "Mocha",
|
|
"Wood", "Space", "Manic", "Grunt", "X-Ray", "Sabbra", "Atomic", "Swordfish", "Dance", "Tank",
|
|
"Lazy", "Glorious",
|
|
"Abstract", "Abyssal", "Airborne", "Ancestral", "Blazing", "Bright", "Burning", "Colourless",
|
|
"Crystal", "Deadly", "Exhausted", "Favourite", "Final", "Floating", "Flying", "Frozen",
|
|
"Geometric", "Gravity", "Halcyon", "Hyper", "Infinite", "Inspiring", "Limitless", "Lucent",
|
|
"Luminous", "Magnificent", "Parallax", "Prime", "Radiant", "Raging", "Rebuilt", "Reckless",
|
|
"Relentless", "Ruthless", "Second", "Serene", "Shimmering", "Soaring", "Speedy", "Stellar",
|
|
"Swift", "Timeless", "Towering", "Tranquil", "Ultimate", "Visionary", "Whispering", "Winged",
|
|
"Cosmic", "Critical", "Dark"}
|
|
|
|
var right = []string{"Aganju", "Cygni", "Akeron", "Antares", "Aragoth", "Ardus", "Carpenter", "Cooper", "Dahin", "Capella", "Endriago", "Gallina",
|
|
"Fenris", "Freya", "Glenn", "Grissom", "Jotunheim", "Lagarto", "Primus", "Vega", "Ragnarok", "Shepard",
|
|
"Slayton", "Tarsis", "Mercury", "Venus", "Mars", "Earth", "Terra", "Jupiter", "Saturn", "Uranus", "Neptune", "Pluto", "Europa", "Ganymede",
|
|
"Callisto", "Titan", "Juno", "Eridanus", "Scorpius", "Crux", "Cancer", "Taurus", "Lyra", "Andromeda", "Virgo", "Aquarius", "Cygnus", "Corvus",
|
|
"Taurus", "Draco", "Perseus", "Pegasus", "Gemini", "Columbia", "Bootes", "Orion", "Deneb", "Merope", "Agate", "Amber", "Beryl", "Calcite",
|
|
"Citrine", "Coral", "Diamond", "Emerald", "Garnet", "Jade", "Lapis", "Moonstone", "Obsidian", "Onyx", "Opal", "Pearl", "Quartz", "Ruby",
|
|
"Sapphire", "Topaz", "Iron", "Lead", "Nickel", "Copper", "Zinc", "Tin", "Manes", "Argon", "Neon", "Alpha", "Bravo", "Charlie", "Delta",
|
|
"Echo", "Foxtrot", "Golf", "Hotel", "India", "Juliett", "Kilo", "Lima", "Mike", "November", "Oscar", "Papa", "Quebec", "Romeo", "Sierra",
|
|
"Tango", "Uniform", "Victor", "Whisky", "Xray", "Yankee", "Zulu", "Fate", "Miner", "Blaster", "Click", "Noise", "Cadabra", "Shotgun",
|
|
"Swordfish", "Dancer", "Dragon", "Lotus", "Storm",
|
|
"Songbird", "Purpose",
|
|
"Aegis", "Anvil", "Ashes", "Bard", "Breath", "Claws", "Departure", "Eagle", "Falcon", "Focus",
|
|
"Forge", "Hammer", "Hand", "Hawk", "Marvel", "Master", "Mirror", "Nemesis", "Omen", "Pillar",
|
|
"Pride", "Prophecy", "Reflection", "Shield", "Skylark", "Spear", "Sword", "Talon", "Triumph",
|
|
"Victory", "Vision", "Asimov"}
|
|
|
|
/**
|
|
Return a single random value from a slice
|
|
*/
|
|
|
|
func randomVal(slice []string) string {
|
|
rand.Seed(time.Now().UnixNano())
|
|
m := len(slice)
|
|
mn := 0;
|
|
|
|
v := rand.Intn(m-mn) + mn
|
|
|
|
outval := slice[v]
|
|
|
|
return outval
|
|
|
|
}
|
|
|
|
/**
|
|
Generate a string of count entries from a slice
|
|
*/
|
|
func numberCluster(count int, slice []string) string {
|
|
builder := []string{}
|
|
|
|
for i:= 0; i < count; i++ {
|
|
builder = append(builder, randomVal(slice))
|
|
}
|
|
|
|
output := strings.Join(builder, "")
|
|
|
|
return output
|
|
}
|
|
|
|
func main() {
|
|
ws := randomVal(whitespace)
|
|
|
|
long := []string{}
|
|
short := []string{}
|
|
|
|
long = append(long, randomVal(left))
|
|
long = append(long, randomVal(right))
|
|
long = append(long, numberCluster(3, numbers))
|
|
|
|
short = append(short, numberCluster(8, alpha))
|
|
|
|
longOutput := strings.Join(long, ws)
|
|
shortOutput := strings.Join(short, ws)
|
|
|
|
fmt.Printf("Long Password: %s\n\n", longOutput)
|
|
|
|
passwordStenght := zxcvbn.PasswordStrength(longOutput, nil)
|
|
|
|
fmt.Printf("Password score (0-4): %d\nEstimated entropy (bit): %f\nEstimated time to crack: %s\n\n",
|
|
passwordStenght.Score,
|
|
passwordStenght.Entropy,
|
|
passwordStenght.CrackTimeDisplay,
|
|
)
|
|
|
|
fmt.Printf("Short Password: %s\n\n", shortOutput)
|
|
|
|
passwordStenght = zxcvbn.PasswordStrength(shortOutput, nil)
|
|
|
|
fmt.Printf("Password score (0-4): %d\nEstimated entropy (bit): %f\nEstimated time to crack: %s\n\n",
|
|
passwordStenght.Score,
|
|
passwordStenght.Entropy,
|
|
passwordStenght.CrackTimeDisplay,
|
|
)
|
|
|
|
} |