Domanda

Qual è uno schema di crittografia valido e semplice per proteggere le password in un database?Non ho necessariamente bisogno di qualcosa che sia iper-sicuro né di qualcosa che sia velocissimo, ma quelle cose sarebbero carine.Principalmente, voglio solo qualcosa che sia facile da implementare senza essere terribilmente lento o insicuro.

È stato utile?

Soluzione

Come dice Mc, SHA1 o MD5 sono quelli standard, insieme a SHA2.


Aggiornamento:Poiché i processori sono diventati più veloci nel corso degli anni, gli hash sono diventati più brutali.Ora è consigliato l'uso bcrypt.


Ciò che desideri è più generalmente chiamato funzione hash crittografica.Gli hash crittografici sono progettati per essere unidirezionali (dato l'hash risultante, non dovresti essere in grado di derivare l'input originale).Inoltre, la probabilità che due stringhe arbitrarie abbiano lo stesso hash (nota come collisione di hash) dovrebbe essere bassa (idealmente 1/numero di valori hash).

Sfortunatamente, solo perché le tue password sono sottoposte ad hashing non ti libera dal dover impegnarti davvero per mantenere al sicuro le versioni con hash.Troppe persone utilizzeranno password deboli che sarebbero vulnerabili a un attacco di forza bruta offline.

Modifica: diverse persone hanno già sottolineato l'importanza dell'uso del sale.Un sale è un valore costante che si mescola con l'input prima di utilizzare la funzione hash.Avere un salt unico impedisce agli aggressori offline di utilizzare tabelle precalcolate di password comuni (tabelle arcobaleno) per forzare le tue password ancora più velocemente.

Altri suggerimenti

MD5 O SHA1 + sale.

Se usi MD5 o SHA1 usa un sale per evitare gli hack della tabella arcobaleno.

In C# questo è semplice:

MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
string addSalt = string.Concat( "ummm salty ", password );
byte[] hash = hasher.ComputeHash( Encoding.Unicode.GetBytes( addSalt ) );

Facile: BCripta.

Quello di Jeff Probabilmente stai memorizzando le password in modo errato l'articolo è un'ottima lettura su questo argomento.

Questo è stato un mio problema un paio di settimane fa.Stavamo implementando un vasto progetto MIS in 975 diverse località geografiche in cui il nostro archivio di credenziali utente verrà utilizzato come autenticatore per diversi set di applicazioni già implementate e in uso.Abbiamo già fornito il servizio di autenticazione basato su REST e SOAP, ma il cliente ha insistito per poter raggiungere l'archivio delle credenziali dell'utente da altre applicazioni con solo una connessione DB per la visualizzazione di sola lettura della tabella o vista correlata.Sospiro... (questa decisione di progettazione errata altamente accoppiata è oggetto di un'altra domanda).

Ciò ci ha costretto a convertire il nostro schema di archiviazione delle password salate e con hash iterativo in una specifica e a fornire alcune implementazioni linguistiche diverse per una facile integrazione.

L'abbiamo chiamata password con hash abbastanza sicure o FSHP in breve.Implementato in Python, Ruby, PHP5 e rilasciato di pubblico dominio.Disponibile per essere consumato, biforcato, fiammato o sputato su GitHub all'indirizzo http://github.com/bdd/fshp

FSHP è un'implementazione salted e iterativa dell'hashing delle password.

Il principio di progettazione è simile a PBKDF1 specifica nella RFC 2898(ovvero:PKCS n.5:Specifica di crittografia basata su password versione 2.0.)FSHP consente di scegliere la lunghezza del sale, il numero di iterazioni e la funzione di hash crittografiche sottostanti tra SHA-1 e SHA-2 (256, 384, 512).Il metaprefisso autodefinito all'inizio di ogni output lo rende portabile consentendo al consumatore di scegliere la propria linea di base per la sicurezza dell'archiviazione delle password.

SICUREZZA:

L'FSHP1 predefinito utilizza sali da 8 byte, con 4096 iterazioni di hashing SHA-256.- 8 byte Rendes Rendes Rainbow Table Attacchi impraticabili moltiplicando lo spazio richiesto con 2^64.- 4096 iterazioni rendono gli attacchi di forza bruta piuttosto costosi.- Non ci sono attacchi noti contro SHA-256 per trovare collisioni con uno sforzo computazionale di meno di 2^128 operazioni al momento di questa versione.

IMPLEMENTAZIONI:

  • Pitone:Testato con 2.3.5 (con hashlib), 2.5.1, 2.6.1
  • Rubino:Testato con 1.8.6
  • PHP5:Testato con 5.2.6

Ognuno è più che benvenuto a creare implementazioni linguistiche mancanti o a lucidare quelle attuali.

OPERAZIONE BASE (con Python):

>>> fsh = fshp.crypt('OrpheanBeholderScryDoubt')
>>> print fsh
{FSHP1|8|4096}GVSUFDAjdh0vBosn1GUhzGLHP7BmkbCZVH/3TQqGIjADXpc+6NCg3g==
>>> fshp.validate('OrpheanBeholderScryDoubt', fsh)
True

PERSONALIZZARE LA CRIPTA:

Indeboliamo il nostro schema di hashing della password.- Diminuire la lunghezza del sale dal valore predefinito 8 a 2.- Diminuire il ciclo di iterazione dal valore predefinito 4096 a 10.- Seleziona FSHP0 con SHA-1 come algoritmo hash sottostante.

>>> fsh = fshp.crypt('ExecuteOrder66', saltlen=2, rounds=10, variant=0)
>>> print fsh
{FSHP0|2|10}Nge7yRT/vueEGVFPIxcDjiaHQGFQaQ==

Usa il SHA Algoritmo di hashing unidirezionale insieme a un sale univoco.È l'algoritmo principale che utilizzo per archiviare le mie password nel database.

Se stai utilizzando SQL Server, c'è la funzione HashBytes:

http://msdn.microsoft.com/en-us/library/ms174415.aspx

Appoggio il voto per MD5 o SHA con un sale.Tutti i principali linguaggi di sviluppo web hanno funzioni integrate per calcolare l'hash (in PHP, ad esempio, il pacchetto mcrypt contiene le funzioni necessarie).

Devi utilizzare un algoritmo hash unidirezionale come SHA-1 suggerito sopra con un sale.Suggerirei questo sito per ulteriori informazioni.Include alcuni esempi di codice/implementazione.http://www.obviex.com/samples/hash.aspx

La chiave per una migliore sicurezza, penso, è usare i sali dinamici.Ciò significa che generi una stringa casuale per ogni nuovo utente e usi quella stringa per salare l'hash.Naturalmente, è necessario memorizzare questo sale nel database per poter verificare la password in un secondo momento (non la crittografo in alcun modo).

Per una crittografia non reversibile sceglierei sicuramente SHA256 o SHA1.MD5 ha parecchie collisioni ora e sono stati fatti molti sforzi per risolverlo, quindi non è buono da usare.

Se vuoi rendere la tua soluzione a prova di futuro, ti consiglio SHA256 o SHA512.Il geekworld crittografico sta diventando nervoso per MD5 e, in misura leggermente minore, SHA1.

Oppure, se puoi, aspetta SHA-3

Ho notato molta confusione su come eseguire correttamente l'hashing della password, in particolare su StackOverflow.Quindi ho scritto una pagina che dovrebbe chiarire tutto.C'è qualcosa di più rispetto all'utilizzo di un semplice hash.

Ulteriori informazioni: Come eseguire correttamente l'hashing della password

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top