2015-08-12 22 views
5

Se è necessario generare una stringa/token per autenticare richieste future (ad esempio una chiave API, un URL di conferma dell'email, ecc.), Quali fattori dovrebbero essere considerati?Cosa rende una stringa/token crittograficamente sicura?

In particolare

  • Ciò che rende la stringa "sicuro"/"molto difficile da indovinare"?
  • Come viene misurata/stimata la "quantità di sicurezza"?
  • Quali sono gli standard principali là fuori?

Un esempio pratico

Prendiamo queste due stringhe di output da NodeJS.

Stringa 1 (attraverso Node crypto)

var crypto = require('crypto'); 
crypto.randomBytes(48, function (ex, buf) { 
    console.log(buf.toString('hex')); 
}); 

String 2 (attraverso Node UUID)

var uuid = require('node-uuid'); 
console.log(uuid.v4()); 

Sulla base dei concetti di cui sopra, che si sarebbe più sicuro e perché?

Inoltre, non esitate a suggerire qualsiasi buon materiale introduttivo sull'argomento, in quanto non ho potuto trovare facilmente articoli su questo online.

+0

Penso che non ci sia una differenza per quanto riguarda i vostri dati e le finalità d'uso. – marekful

+0

@marekful, grazie! Dove sto cercando di arrivare qui però è: come si può capire la differenza? – Pensierinmusica

+1

Controlla questa pagina su [randomness cripto-forza] (http://www.cs.berkeley.edu/~daw/rnd/). –

risposta

5

Ciò che rende la stringa "sicura"/"molto difficile da indovinare"?

Una stringa o un token non può essere crittograficamente sicuro, perché è static.

La nozione di generatore di numeri casuali (pseudo) crittograficamente sicuro (CS (P) RNG) descrive che i numeri prodotti non sono prevedibili. È una proprietà della procedura e non dei singoli numeri.

Come viene misurata/stimata la "quantità di sicurezza"?

Dipende dalle fonti di casualità utilizzate, perché alcune di esse sono una scatola nera. Puoi generare un sacco di casualità e vedere se trovi alcuni pattern lì. Ci sono some test suites available, ma poi devi pensare alla tua applicazione e quanto velocemente hai bisogno di quei numeri casuali. È possibile che richiedendo molta casualità esaurisca il pool e quindi produca numeri insufficientemente casuali.

Quali sono le principali norme in circolazione?

destinazione d'uso crittograficamente sicuro fonti casualità del sistema/del quadro. Node.js 'crypto.randomBytes() è uno di quelli se vuoi fidarti della documentazione.

Un esempio pratico

nodo-uuid utilizza crypto.randomBytes()internally, per cui v'è essenzialmente la stessa forza casualità dietro, ma passano a Math.random() se crypto.randomBytes() non è disponibile. Math.random() is not cryptographically secure. Se si desidera avere valori casuali protetti da crittografia nel browser, sarà necessario interrogare l'API di Crypto Web getRandomValues().

+0

Sfortunatamente, node-uuid farà [silenziosamente il fallback a un PRNG non sicuro] (https://github.com/broofa/node-uuid/blob/4ff82d52f9c9026fbacfb31eebb92c37efc460b2/uuid.js#L38-L52). –

+0

Sì, ricadrà su PRNG non sicuro, ma solo per gli ambienti browser o le versioni veramente vecchie di node.js. –

+0

Personalmente preferirei che si verifichino errori dicendo "questo non può essere utilizzato in sicurezza su una piattaforma non sicura, aggiorna il software". –