metodi sicuri per generare le chiavi di sessione

2

Quindi ho questa applicazione web in cui dovrei generare la mia chiave di sessione da utilizzare nel gestore di sessione. Ho solo poche domande sugli approcci sicuri a questo.

  • Credo che per rendere questo sicuro dovrebbe essere una chiave generata a caso ed è univoco in ogni istanza dei miei processi di app web. La mia ipotesi è corretta?

  • Uso Go 1.2 per la mia app Web e il modo in cui sto generando questa stringa casuale è utilizzando la seguente funzione:

    func generateRandomSessionKey() string {
      rand.Seed(time.Now().UnixNano())
      alpha := "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789~!@#$%^&{}[]:,.*()_+-/?><."
      buf := make([]byte, KEYLENGTH)
    
        for i := 0; i < KEYLENGTH; i++ {
            buf[i] = alpha[rand.Intn(len(alpha))]
        }
    
     return string(buf)
    }
    

Questa funzione produce stringhe come: Hu@$pMaNZd.2)%Lpeet{6hYmKAxn:yYt

Ora so che alcuni potrebbero argomentare perché non utilizzare "crypto / rand" invece di "math / rand" che si è dimostrato più sicuro, ho provato e apparentemente le crypto / rand hanno generato stringhe non valide, ad es. \x16 che non può essere utilizzato dal framework web che sto usando ( Beego ). Quindi, quello che sto facendo qui è un approccio ragionevole e sicuro per generare questa chiave?

    
posta ymg 03.03.2014 - 01:59
fonte

2 risposte

3

crypto / rand genera stringhe binarie. Naturalmente, le stringhe binarie non possono essere utilizzate direttamente come testo normale. Devi prima codificarli in una rappresentazione di testo appropriata (ad esempio base64). Simile al tuo codice fornito puoi usare crypto / rand come segue:

import ("crypto/rand")

func rndString(n int) string {
    const alpha = "abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789~!@#$%^&{}[]:,.*()_+-/?><."
    var bytes = make([]byte, n)
    rand.Read(bytes)
    for i := 0; i < n; i++ {
        bytes[i] = alpha[bytes[i] % byte(len(alpha))]
    }
    return string(bytes)
}

Non devi mai seminare il generatore di numeri casuali con il tempo di unix. Per qualsiasi momento un utente malintenzionato potrebbe generare sessioni valide molto facilmente. Se sei su un sistema Linux e se vuoi veramente seminare un PRNG dovresti leggere il seme da / dev / urandom che può essere trattato come un normale file su sistemi Linux.

    
risposta data 03.03.2014 - 09:22
fonte
2

I have tried that and apparently the crypto/rand generated invalid strings e.g. \x16 that cannot be used by the web framework I'm using.

Quello che dovresti fare è prendere i dati generati da crypto / rand e ricodificarli in un modo che corrisponda a quanto richiesto dal tuo framework web. Dovresti menzionare qual è il framework nel porre la domanda e dovresti cercare di far corrispondere il tuo output a ciò che l'input è esattamente.

rand.Seed(time.Now().UnixNano())

Questa è una cattiva idea. Posso facilmente intuire che in base a che ora è e duplicare i risultati sul mio fine.

    
risposta data 03.03.2014 - 04:08
fonte

Leggi altre domande sui tag