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
Suggestions int
RuleSets []string // e.g. ["random","passphrase","hybrid"]
LeetProb float64
}
type genRequest struct {
@@ -86,6 +87,23 @@ func main() {
/* -------------------- 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 {
minLen := intEnv("MIN_LENGTH", 12)
minLower := intEnv("MIN_LOWER", 2)
@@ -95,6 +113,7 @@ func loadConfig() Config {
addr := strEnv("SERVER_ADDR", ":8080")
specials := strEnv("SPECIALS", "!@#$%&*()-=+:?")
leet := parseLeetMap(strEnv("LEET_MAP", "a:4,e:3,o:0,t:7"))
leetProb := floatEnv("LEET_PROB", 0.35)
sug := intEnv("SUGGESTION_COUNT", 5)
rules := strEnv("RULESETS", "random,passphrase,hybrid")
rs := []string{}
@@ -118,6 +137,7 @@ func loadConfig() Config {
LeetMap: leet,
Suggestions: sug,
RuleSets: rs,
LeetProb: leetProb,
}
}
@@ -170,7 +190,7 @@ func generateFromSentence(sentence string, cfg Config) (string, complexity) {
if i > 0 {
b.WriteString(randFrom(cfg.Specials))
}
b.WriteString(applyLeet(w, cfg.LeetMap))
b.WriteString(applyLeet(w, cfg.LeetMap, cfg.LeetProb))
}
pw := b.String()
@@ -181,17 +201,17 @@ func generateFromSentence(sentence string, cfg Config) (string, complexity) {
return ensureAll(pw, cfg)
}
func applyLeet(s string, leet map[rune]string) string {
var b strings.Builder
for _, r := range s {
lr := unicode.ToLower(r)
if rep, ok := leet[lr]; ok {
b.WriteString(rep)
} else {
b.WriteRune(r)
}
}
return b.String()
func applyLeet(s string, leet map[rune]string, p float64) string {
var b strings.Builder
for _, r := range s {
lr := unicode.ToLower(r)
if rep, ok := leet[lr]; ok && randChance(p) {
b.WriteString(rep) // Ersetze nur mit Chance p
} else {
b.WriteRune(r)
}
}
return b.String()
}
func sprinkleCase(s string) string {
@@ -370,7 +390,7 @@ func genHybrid(cfg Config) string {
if coin() {
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
base = insertAt(base, randPos(base), randFrom(cfg.Specials))
// 35 Ziffern an zufälligen Stellen