2010-08-23 9 views
6

Contribuisco a un progetto PHP open source relativamente maturo. Recentemente, ho scoperto che memorizza le password come semplici hash MD5, il che è piuttosto fastidioso per me. Ho pensato che se avessi intenzione di risolverlo, avrei potuto anche fare Do It Right (tm), quindi volevo usare bcrypt.Come posso vendorizzare bcrypt in un'applicazione PHP (e dovrei)?

In primo luogo, quello che ho trovato per altre lingue: bcrypt-ruby sembra utilizzare il codice C originale da OpenBSD o codice java jBCrypt. py-bcrypt è un sottile involucro attorno al codice BSD. BCrypt.net è una porta diretta di jBCrypt.

Ora, PHP stesso supporta bcrypt (anche se, ingannevolmente chiamato semplicemente 'blowfish') in the crypt function. Tuttavia, le versioni precedenti alla 5.3 richiedono il supporto del sistema stesso, generalmente fornito da crypt_blowfish. phpass è lo stesso e consiglia di installare PHP 5.3 o Suhosin.

Poiché molti utenti dell'applicazione utilizzano l'hosting condiviso standard, non desidero richiedere alcuna configurazione speciale del server. Speravo di rubare il codice dalla versione 5.3 di PHP, ma è in C, e (dal poco di lettura che ho appena fatto) non posso richiedere l'uso di un'estensione C per gli utenti del progetto.

Ho pensato di creare una porta in puro PHP di bcrypt, ma guardando the source of jBCrypt, non sono sicuro che dovrei, dato che non sono incredibilmente familiare con PHP o blowfish, e un errore qui potrebbe essere contemporaneamente pericoloso e difficile da rilevare in primo luogo.

Quindi, vi presento due domande (più parti):

  1. È mia mancanza di conoscenza PHP ottenere il meglio di me? Posso davvero utilizzare una delle implementazioni già create?
  2. Dovrei invece creare una semplice funzione loooping che chiama ripetutamente sha1() o md5() per un numero di volte configurabile?

risposta

7

È mia mancanza di conoscenza PHP ottenere il meglio di me? Posso davvero utilizzare una delle implementazioni già create?

Sfortunatamente, sei corretto. Prima di 5.3.0 PHP non supportava bcrypt per impostazione predefinita. Invece, si basava sul supporto del sistema operativo (controllare la costante CRYPT_BLOWFISH). Come hai sottolineato, Suhosin è un'opzione in questo caso.

Devo invece creare semplicemente una semplice funzione loooping che chiami ripetutamente sha1() o md5() per un numero di volte configurabile?

Il miglior consiglio in fatto di crittografia è "non arrotolare il proprio". Le chiamate ripetute a sha1() o md5()possono aumentare o diminuire la sicurezza di.

Gli autori di bcrypt, d'altra parte, spiegano le loro decisioni di progettazione su this paper.

+0

+1 per non crittografare le password. Gli hash dovrebbero sempre essere usati. – rook

+11

Anche se bcrypt è in realtà una funzione di hash costruita con un codice a blocchi ... – rook

+0

Null, hai qualche risorsa da gettare al problema sotto? –

1

Purtroppo non è possibile utilizzare bcrypt con Blowfish se non si utilizza PHP 5.3 o l'estensione Suhosin o se il sistema operativo supporta Blowfish nella sua implementazione di bcrypt.

Quindi la soluzione migliore in questo caso sarebbe utilizzare SHA-256 o SHA-512 con key stretching (e, naturalmente, sale). Ma rotolare la propria soluzione non è mai una buona idea quando si tratta di sicurezza.

1

Uno dei vantaggi di phpass che non è stato toccato è che ricade automaticamente su DES e infine su MD5 come cifrario sottostante se CRYPT_BLOWFISH non è disponibile. Il wrapper li usa in modo tale che anche l'implementazione di md5 sia significativamente più sicura di un semplice hash.

Problemi correlati