Protezione degli indirizzi email se i loro hash sono pubblicamente disponibili

1

Sto lavorando a un progetto, in cui gli hash degli indirizzi email degli utenti saranno disponibili pubblicamente e devo impedire che vengano rapidamente scoperti dagli spammer.

L'idea principale dell'impresa è quella di offrire a chiunque conosca già gli indirizzi e-mail un modo semplice per trovare utenti da loro, ma rende difficile scoprire le e-mail con una semplice enumerazione di possibili alternative.

Quello che ho pensato è usare BCrypt o PBKDF2 per creare gli hash, e usare salt per creare hash dove la somma dei byte nel primo tempo è uguale alla somma dei byte nella seconda metà.

Ecco come potrebbe essere l'algoritmo:

    static byte[] GenerateMagicSignature(string text)
    {
        long id = 0;
        const int nParts = 2;
        while (true)
        {
            var key = BitConverter.GetBytes(id);

            for (long i = 0; i < id+1; i++)
            {
                var dd = new HMACSHA256(key);//replaced new encoding....
                key = dd.ComputeHash(key); 
            }

            var b=new Rfc2898DeriveBytes(text,key,10000);

            var sig=b.GetBytes(32);
            id++;
            var pts = SplitIntoPartsAndSum(sig, nParts);

            int val = pts[0];

            bool wrong = false;
            for (int i = 1; i < pts.Length; i++)
            {
                if (val!=pts[i])
                {
                    wrong = true;
                    break;
                }
            }

            if (wrong)
            {
                continue;
            }


            return sig;
        }
    }

    static int[] SplitIntoPartsAndSum(byte[] data, int parts)
    {
        var sums=new List<int>();

        for (int i = 0; i < parts; i++)
        {
            int sum = 0;
            var start = i*data.Length/parts;
            var end = (i + 1)*data.Length/parts;
            if (i==parts-1)
            {
                end = data.Length;
            }
            for (int j = start; j < end; j++)
            {
                sum += data[j];
            }

            sums.Add(sum);
        }

        return sums.ToArray();
    }

Il tempo medio di hashing per un indirizzo email conosciuto con queste impostazioni è di circa 1 minuto su una singola CPU. Quale ora può essere diviso per 5000 core di cuda, se capisco correttamente questa roba (o l'uso di PBKDF2 ridurrà significativamente quel numero?).

La mia domanda è: farlo è una buona idea, o devo ripensare a tutta la faccenda? Il mio obiettivo non è quello di rendere gli indirizzi e-mail completamente protetti, ma rendere più difficile per l'attaccante ottenerli rispetto, ad esempio, inviando query a Facebook e controllando se conosce o meno quelle e-mail.

    
posta Arsen Zahray 12.01.2016 - 00:12
fonte

1 risposta

1

Gli indirizzi di posta elettronica sono spesso costruiti in modo semplice da costruire, schemi comuni con dati pubblici - prima iniziale più cognome @ società, nome punto cognome @ azienda, ecc. ecc.

Inoltre, molti indirizzi email sono stati trapelati e diversi gruppi di aggressori hanno rubato o acquistato grandi elenchi di indirizzi e-mail per provare anche.

Pertanto, gli aggressori hanno uno spazio delle chiavi molto più piccolo di quando attaccano le password.

Indirizzerò PBKDF2 in specifico; supponendo che i tuoi clienti dispongano di macchine potenti e moderne a 64-bit, possono ancora usare solo un core per cancellare un indirizzo e-mail (il proprio); Hashcat probabilmente ha uno dei set di codice ottimizzati disponibili per CPU, e oclHashcat allo stesso modo per GPU.

Supponendo una configurazione di stile PBKDF2-HMAC-SHA-1 (cioè SHA-1 è l'hash di base), allora puoi aspettarti una singola seria scatola moderna da 8 GPU per scricchiolare le password da 1500 a 2500 volte più velocemente del codice x64 in esecuzione su una CPU moderna abbastanza seria; il vantaggio aumenta solo se i tuoi utenti hanno hardware scaduto, hardware economico, hardware a basso consumo o dispositivi mobili.

Anche a, diciamo, 2000 volte più veloce, l'attaccante ha una media di 0,03 secondi per eseguire un test su un'email che ha impiegato un client per generare un minuto.

PBKDF2-HMAC-SHA-512 ridurrebbe il vantaggio dell'attaccante, ma sei ancora in una partita persa, dal momento che un malintenzionato può far ruotare le loro GPU e lasciare la macchina per provare i modelli di email per due milioni e mezzo di secondi ( 30 giorni) facilmente, pagando solo una bolletta elettrica e la perdita di quella macchina per altre azioni.

In alternativa, gli spammer possono semplicemente dedicare tempo di CPU di riserva, che probabilmente hanno in abbondanza, per convalidare i loro elenchi di e-mail contro il tuo elenco di e-mail. È persino gratuito se utilizzano i computer di altre persone (ad esempio una botnet)!

    
risposta data 03.02.2016 - 06:30
fonte

Leggi altre domande sui tag