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.