Proteger las direcciones de correo electrónico si sus hashes están disponibles públicamente

1

Estoy trabajando en un proyecto, donde los hash de las direcciones de correo electrónico de los usuarios estarán disponibles públicamente y debo evitar que los spammers los descubran rápidamente.

La idea principal del compromiso es dar a cualquier persona que ya conozca las direcciones de correo electrónico una forma fácil de encontrar usuarios, pero dificultar el descubrimiento de correos electrónicos mediante la simple enumeración de posibles alternativas.

En lo que pensé es en usar BCrypt o PBKDF2 para crear los hashes, y usar sal para crear hashes donde la suma de los bytes en la primera mitad es igual a la suma de los bytes en la segunda mitad.

Así es como podría verse el 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();
    }

El tiempo promedio de hash para una dirección de correo electrónico conocida con estas configuraciones es de aproximadamente 1 minuto en una sola CPU. En este momento, se puede dividir por 5000 cuda cores, si entiendo esto correctamente (¿o el uso de PBKDF2 reducirá significativamente ese número?).

Mi pregunta es: ¿es una buena idea hacerlo o tengo que volver a pensar todo esto? Mi objetivo no es hacer que las direcciones de correo electrónico estén completamente protegidas, sino hacer que sea más difícil para el atacante obtenerlas que, por ejemplo, al enviar consultas a Facebook y verificar si conoce esos correos electrónicos o no.

    
pregunta Arsen Zahray 12.01.2016 - 00:12
fuente

1 respuesta

1

Las direcciones de correo electrónico se construyen a menudo a partir de patrones fáciles de construir, comunes con datos públicos: primera inicial más apellido @ compañía, primer nombre punto apellido @ compañía, etc. etc.

Además, se han filtrado muchas direcciones de correo electrónico reales, y varios grupos de atacantes también habrán robado o comprado grandes listas de direcciones de correo electrónico para intentarlo.

Por lo tanto, los atacantes tienen un espacio de teclas mucho más pequeño que cuando atacan contraseñas.

Me dirigiré a PBKDF2 en específico; asumiendo que sus clientes tienen máquinas modernas y potentes de 64 bits, aún pueden usar un solo núcleo para hacer una dirección de correo electrónico (la suya); Hashcat probablemente tenga uno de los conjuntos de código más optimizados disponibles para la CPU, y oclHashcat también para GPU.

Suponiendo que se trata de una configuración de estilo PBKDF2-HMAC-SHA-1 (es decir, SHA-1 es el hash básico), entonces puede esperar que una única caja seria de 8 GPU para procesar las contraseñas 1500 a 2500 veces más rápido que el código x64 que se ejecuta una CPU moderna bastante seria; la ventaja solo aumenta si sus usuarios tienen hardware obsoleto, hardware económico, hardware de bajo consumo o dispositivos móviles.

Incluso en, digamos, 2000 veces más rápido, el atacante tiene un promedio de 0.03 segundos para ejecutar una prueba en un correo electrónico que un cliente demoró un minuto en generar.

PBKDF2-HMAC-SHA-512 reduciría la ventaja del atacante, pero aún estás en un juego perdido, ya que un atacante puede girar sus GPU y dejar la máquina para probar los patrones de correo electrónico durante dos millones y medio de segundos ( 30 días) fácilmente, pagando solo una factura de electricidad y la pérdida de esa máquina por otras acciones.

Alternativamente, los spammers pueden simplemente dedicar tiempo de CPU de repuesto, que probablemente tienen, para validar sus listas de correo electrónico contra su lista de correo electrónico. ¡Incluso es gratis si están usando las computadoras de otras personas (es decir, una red de bots)!

    
respondido por el Anti-weakpasswords 03.02.2016 - 06:30
fuente

Lea otras preguntas en las etiquetas