Anpassung Leet: LEET_PROB=0.4
All checks were successful
release-tag / release-image (push) Successful in 2m7s

This commit is contained in:
2025-10-06 09:08:57 +00:00
parent e0920d96a4
commit fa0474de8c

46
main.go
View File

@@ -26,6 +26,7 @@ type Config struct {
LeetMap map[rune]string LeetMap map[rune]string
Suggestions int Suggestions int
RuleSets []string // e.g. ["random","passphrase","hybrid"] RuleSets []string // e.g. ["random","passphrase","hybrid"]
LeetProb float64
} }
type genRequest struct { type genRequest struct {
@@ -86,6 +87,23 @@ func main() {
/* -------------------- Config & ENV -------------------- */ /* -------------------- Config & ENV -------------------- */
func floatEnv(k string, def float64) float64 {
if v := os.Getenv(k); v != "" {
v = strings.ReplaceAll(v, ",", ".") // deutsche Kommas erlauben
if f, err := strconv.ParseFloat(v, 64); err == nil && f >= 0 && f <= 1 {
return f
}
}
return def
}
func randChance(p float64) bool {
if p <= 0 { return false }
if p >= 1 { return true }
// 1e6 Auflösung reicht; kryptografisch sicher über mustCryptoInt
return mustCryptoInt(1_000_000) < int(p*1_000_000)
}
func loadConfig() Config { func loadConfig() Config {
minLen := intEnv("MIN_LENGTH", 12) minLen := intEnv("MIN_LENGTH", 12)
minLower := intEnv("MIN_LOWER", 2) minLower := intEnv("MIN_LOWER", 2)
@@ -95,6 +113,7 @@ func loadConfig() Config {
addr := strEnv("SERVER_ADDR", ":8080") addr := strEnv("SERVER_ADDR", ":8080")
specials := strEnv("SPECIALS", "!@#$%&*()-=+:?") specials := strEnv("SPECIALS", "!@#$%&*()-=+:?")
leet := parseLeetMap(strEnv("LEET_MAP", "a:4,e:3,o:0,t:7")) leet := parseLeetMap(strEnv("LEET_MAP", "a:4,e:3,o:0,t:7"))
leetProb := floatEnv("LEET_PROB", 0.35)
sug := intEnv("SUGGESTION_COUNT", 5) sug := intEnv("SUGGESTION_COUNT", 5)
rules := strEnv("RULESETS", "random,passphrase,hybrid") rules := strEnv("RULESETS", "random,passphrase,hybrid")
rs := []string{} rs := []string{}
@@ -118,6 +137,7 @@ func loadConfig() Config {
LeetMap: leet, LeetMap: leet,
Suggestions: sug, Suggestions: sug,
RuleSets: rs, RuleSets: rs,
LeetProb: leetProb,
} }
} }
@@ -170,7 +190,7 @@ func generateFromSentence(sentence string, cfg Config) (string, complexity) {
if i > 0 { if i > 0 {
b.WriteString(randFrom(cfg.Specials)) b.WriteString(randFrom(cfg.Specials))
} }
b.WriteString(applyLeet(w, cfg.LeetMap)) b.WriteString(applyLeet(w, cfg.LeetMap, cfg.LeetProb))
} }
pw := b.String() pw := b.String()
@@ -181,17 +201,17 @@ func generateFromSentence(sentence string, cfg Config) (string, complexity) {
return ensureAll(pw, cfg) return ensureAll(pw, cfg)
} }
func applyLeet(s string, leet map[rune]string) string { func applyLeet(s string, leet map[rune]string, p float64) string {
var b strings.Builder var b strings.Builder
for _, r := range s { for _, r := range s {
lr := unicode.ToLower(r) lr := unicode.ToLower(r)
if rep, ok := leet[lr]; ok { if rep, ok := leet[lr]; ok && randChance(p) {
b.WriteString(rep) b.WriteString(rep) // Ersetze nur mit Chance p
} else { } else {
b.WriteRune(r) b.WriteRune(r)
} }
} }
return b.String() return b.String()
} }
func sprinkleCase(s string) string { func sprinkleCase(s string) string {
@@ -370,7 +390,7 @@ func genHybrid(cfg Config) string {
if coin() { if coin() {
w2 = strings.ToUpper(w2[:1]) + w2[1:] w2 = strings.ToUpper(w2[:1]) + w2[1:]
} }
base := applyLeet(w1, cfg.LeetMap) + randFrom(cfg.Specials) + applyLeet(w2, cfg.LeetMap) base := applyLeet(w1, cfg.LeetMap, cfg.LeetProb) + randFrom(cfg.Specials) + applyLeet(w2, cfg.LeetMap, cfg.LeetProb)
// streue zweite Sonderzeichen // streue zweite Sonderzeichen
base = insertAt(base, randPos(base), randFrom(cfg.Specials)) base = insertAt(base, randPos(base), randFrom(cfg.Specials))
// 35 Ziffern an zufälligen Stellen // 35 Ziffern an zufälligen Stellen