package main import ( "crypto/rand" "fmt" "log" "net/http" ) const ( passwordLength = 32 // Zeichensatz mit 62 möglichen Zeichen pro Position chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" // Zeichensatz mit 58 möglichen Zeichen pro Position // Verwechslungsanfällige Zeichen (0, O, 1, l, I) sind nicht enthalten. // // ## Security Note: ################################################ // Der reduzierte Zeichensatz setzt den Keyspace von 10^57 auf 10^56 herab. // Die Entropie wird von ~192.6 Bit auf ~190.6 Bit herabgesetzt. // Solange die Passwortlänge von 32 Zeichen beibehalten wird ist der // Sicherheitsverlust durch einen reduzierten Zeichensatz akzeptabel, // weil der Keyspace immer noch so groß ist dass ein erraten praktisch // unmöglich ist. // //const chars = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789" ) func generatePassword() string { password := make([]byte, passwordLength) _, err := rand.Read(password) if err != nil { log.Fatal(err) } for i := 0; i < passwordLength; i++ { password[i] = chars[int(password[i])%len(chars)] } return string(password) } func passwordHandler(w http.ResponseWriter, r *http.Request) { password := generatePassword() fmt.Fprint(w, password) } func helpHandler(w http.ResponseWriter, r *http.Request) { helpHTML := ` Hilfe

Hilfe: API-Endpunkt

Diese Anwendung bietet einen API-Endpunkt, um Passwörter direkt über die Kommandozeile abzurufen. Der Endpunkt gibt das Passwort im Plain-Text-Format zurück.

Endpunkt:

http://localhost:8080/api/password

Beispiele:

Mac/Linux (Terminal):

echo $(curl -s http://localhost:8080/api/password)

Windows (PowerShell):

Invoke-RestMethod -Uri http://localhost:8080/api/password

Windows (cmd):

curl http://localhost:8080/api/password

Zurück zur Passwort-Generierung

` w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprint(w, helpHTML) } func webHandler(w http.ResponseWriter, r *http.Request) { password := generatePassword() html := fmt.Sprintf( ` Passwort-Generator
API code

Generiertes Passwort

%s
✓ Kopiert!
`, password, ) w.Header().Set("Content-Type", "text/html; charset=utf-8") fmt.Fprint(w, html) } func main() { http.HandleFunc("/", webHandler) http.HandleFunc("/api/password", passwordHandler) http.HandleFunc("/help", helpHandler) log.Println("Server läuft auf http://localhost:8080") log.Println("Plain-Text-Passwort: curl http://localhost:8080/api/password") log.Fatal(http.ListenAndServe(":8080", nil)) }