La mia password è Hashing Secure o no?

0

Ho recentemente creato un codice per la password di hashing. Puoi dare il tuo consiglio per la sicurezza del mio codice? La funzione accetta una password, quindi la converte in un numero.

#include <string>
#include <cmath>

int mod(int x, int y) {
   return x - floor((double) x/y) * y;
}

int crypt(string str) {
   int z = 0;
   for(int i = 0; i < str.size(); i++)
      z += mod( ( str[i] * -(str[i]) ), ((i*29) + 2999) );
   return z;
}

int password = crypt("Password1");

bool auth(string pass, int x) {
   if (crypt(pass) == x) return true;
   else return false;
}
    
posta Ruhan Habib 17.09.2014 - 06:41
fonte

2 risposte

3

Non lo è. Ci sono molti problemi qui:

  • Hai la funzione produce un valore a 32-bit, che non è assolutamente sufficiente per l'hashing della password. Per tali brevi hash è fattibile (e facile) trovare semplicemente la password in collisione (cioè una password diversa dall'originale ma ancora hash con lo stesso valore);
  • La funzione sembra abbastanza semplice da essere "reversibile" nel senso che per un dato valore di hash potrebbe essere facile calcolare la password corrispondente (di nuovo, questa non sarà la password originale, ma una collisione);
  • La funzione è veloce e non richiede molta memoria, che è considerata uno svantaggio per l'hashing della password, in quanto consente l'utilizzo di GPU / ASIC.

Non è quasi mai una buona idea inventare la tua crittografia, inclusi gli hash delle password. Esistono varie alternative ben studiate considerate sicure, quindi dovresti probabilmente usarle (esempi: PBKDF2 , script , bcrypt ). Se queste funzioni non funzionano per te per qualsiasi ragione, ti preghiamo di specificare perché e quali altri vincoli potresti avere. Questa informazione è importante in quanto fornisce un contesto per la tua domanda che al momento manca.

    
risposta data 17.09.2014 - 07:28
fonte
3

Come ha detto @Andrey, problemi, problemi, problemi.

Ed ecco un elenco di alcune collisioni su Password1 . Posso produrre decine di secondi con un semplice programma: HAPPOAAA AHPPOAAA HAPOPAAA AHPOPAAA HAOPPAAA AHOPPAAA ECPPPAAA CEPPPAAA NNFEOCAA NNEFOCAA EAPPPCAA AEPPPCAA NNFCOEAA NNCFOEAA CAPPPEAA ACPPPEAA NNCEOFAA ONOKOHAA NOOKOHAA AAPPOHAA AAPOPHAA AAOPPHAA ONOHOKAA NOOHOKAA NDPOONAA NDOPONAA NDOOPNAA HPAOAPAA APHOAPAA HOAPAPAA EPCPAPAA CPEPAPAA AOHPAPAA LPPPBPAA EPAPCPAA APEPCPAA ONNODPAA NONODPAA CPAPEPAA APCPEPAA APAOHPAA AOAPHPAA BPPPLPAA ONDONPAA NODONPAA PHAAOPAA PAHAOPAA PAAHOPAA FDBOOPAA DFBOOPAA FBDOOPAA BFDOOPAA DBFOOPAA BDFOOPAA LEPOOPAA ELPOOPAA LEOPOPAA

Come detto: Non eseguire il crypto!

    
risposta data 17.09.2014 - 10:41
fonte

Leggi altre domande sui tag