Accesso alla chiave URL - Protezione del non protetto!

0

Ho qualche difficoltà a farlo nel modo giusto (per quanto possa andare) .
Qualche tempo fa, ho chiesto un domanda qui , chiedendo aiuto su come implementare l'invio di un collegamento di accesso tramite e-mail.

Prima di tutto, so che questo è terribilmente insicuro fin dall'inizio, ma abbiamo le nostre ragioni quindi lasciamo perdere questo.

L'idea

L'idea è fondamentalmente l'invio di un'e-mail con un link di lunga durata che dà accesso a un'area molto specifica della nostra app.
Esempio di collegamento: ourwebsite.com/users/ACCESS-KEY

L'attacco che voglio evitare

Un utente che indovina un'altra chiave di accesso usando la propria.

Cosa mi è stato suggerito

Nella mia precedente domanda, mi è stato suggerito di utilizzare una stringa casuale come chiave di accesso che verrà salvata nel mio database.
Ho fatto un po 'di ricerche, e sono preoccupato che il mio PRNG non sia abbastanza casuale, specialmente dal momento che sto generando un sacco di chiavi di accesso alla volta.
Sono stato traumatizzato dalle lezioni di C # a scuola, dove la mia funzione "casuale" avrebbe cambiato l'output ogni 1000 o più iterazioni.

Sto pensando di usare Random.org per avere un seme veramente casuale, ma sembra un po 'eccessivo.

I miei pensieri

Ho 4 opzioni che voglio controllare con voi ragazzi prima di soccombere a Random.org -

  1. Basta usare il PRNG, verificando in anticipo come si comporta (PRNG di Node.js), magari implementando un sleep(500) tra generazioni. Se il risultato è simile ma non identico, cancellalo con SHA-2.
  2. Prendendo l'ID utente e taggandolo accuratamente con PBKDF2 (ha importanza?), salvalo in DB e invialo.
  3. Utilizzo di un PRNG implementato come Mersenee Twister, come suggerito in questa domanda stackoverflow .
  4. Altre cose di cui non so nulla come un codice che so solo come decifrare, o JWT come sto usando per i miei utenti abituali.

Cosa ne pensi?
Grazie per qualsiasi aiuto! Apprezzo il tempo per leggere questo.

    
posta Neta 22.01.2016 - 13:42
fonte

3 risposte

1

ok hai solo bisogno di hash dati specifici dell'utente (ma niente di critico) e combinare i dati utente con numeri unici difficili da indovinare come un paio di valori casuali e la data di creazione (fino al secondo se puoi)

... hash tutto questo e hai una stringa molto difficile da indovinare. la data non sarà la stessa a meno che non tutti la creino entro lo stesso secondo. rendendo questo più complesso. oh e non dimenticare di usare anche il tuo sale.

usare bene un generatore di numeri casuali per qualcosa di simile non è una buona idea (a meno che non si combini, ma non si vuole troppo grande di un numero casuale durante l'hashing), mentre le probabilità sono molto molto molto basse, è possibile generare la stessa chiave per un altro utente, usando i miei suggerimenti rimuovi questa possibilità.

usare un sale di tua creazione dà a quella password personale la sensazione che nessuno al di fuori del mondo dovrebbe scoprirlo, se lo scoprono hai più cose di cui preoccuparti.

gli ints casuali forniscono quel piccolo bit di casualità per fermare le ipotesi formulate.

i dati dell'utente rendono la stringa univoca e la data aggiunge un ulteriore livello in modo che qualcuno non possa indovinare qualcun altro senza conoscere la data di creazione. mantenere il tuo algoritmo e l'ordine in cui lo metti insieme è altrettanto importante.

i tuoi punti:

Semplicemente usando il PRNG, verificando in anticipo come si comporta (PRNG di Node.js), magari implementando un sleep (500) tra generazioni. Se il risultato è simile ma non identico, cancellalo con SHA-2. - Ho già detto che non è necessario, ma è davvero una scelta.

Prendendo l'ID utente e tagliandolo completamente con PBKDF2 (ha importanza?) - sì e no, la funzione di hashing non ha importanza (solo non md5) purché l'hashing sia un hash e non una crittografia (se puoi decifrare la stringa come sua crittografia, NON FARE QUESTO È PERICOLOSO)

Altre cose di cui non so nulla come un cifrario che solo io so come decodificare, o JWT come sto usando per i miei utenti abituali - non decifrare

    
risposta data 22.01.2016 - 13:57
fonte
2

Tutto ciò di cui avrai bisogno in questo caso è GUID per la chiave. La maggior parte delle implementazioni sono casuali e saranno sempre uniche.

Ovviamente è possibile crittografarlo con AES, ma in realtà non aggiunge ulteriore sicurezza oltre a utilizzare i GUID standard.

    
risposta data 22.01.2016 - 14:29
fonte
1

Utilizza un generatore di numeri pseudo casuali (CSPRNG) crittograficamente sicuro .

Non usare classi come math.random o simili, dato che di solito sono seminati con il numero di secondi da mezzanotte e spesso non sono considerati abbastanza imprevedibili se seminati con qualcos'altro.

Esempi in diverse lingue sono:

  • C # - RNGCryptoServiceProvider
  • JavaScript lato client - Window.crypto
  • NodeJS - secure-random
  • Linux - / dev / urandom
risposta data 25.01.2016 - 12:20
fonte

Leggi altre domande sui tag