go-password/password.go

125 lines
5.0 KiB
Go
Raw Normal View History

2024-02-16 11:14:25 +00:00
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",
2024-02-16 12:02:58 +00:00
"Swift", "Timeless", "Towering", "Tranquil", "Ultimate", "Visionary", "Whispering", "Winged",
"Cosmic", "Critical", "Dark"}
2024-02-16 11:14:25 +00:00
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",
2024-02-16 12:02:58 +00:00
"Victory", "Vision", "Asimov"}
/**
Return a single random value from a slice
*/
2024-02-16 11:14:25 +00:00
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
}
2024-02-16 12:02:58 +00:00
/**
Generate a string of count entries from a slice
*/
2024-02-16 11:14:25 +00:00
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,
)
}