Al examinar el almacenamiento de nuestra base de datos de contraseñas con hash con sales, observo una alta tasa de colisiones de sal, es decir, hay demasiados casos en los que dos filas de tablas tienen la misma sal almacenada.
Una solución es comenzar a generar inmediatamente "mejores" sales a medida que almacenamos nuevas contraseñas con sal y hash.
-
Ejecutamos PHP 5.3 en producción. Eso significa que probablemente no podamos usar bibliotecas que dicen que requieren PHP 5.4+. (Digo "probablemente" porque nuestra integración de CentOS incluye algunas características de PHP 5.4. Estamos investigando la compatibilidad de varias bibliotecas).
-
No tenemos libsodium disponible en este momento.
-
Tenemos las extensiones de PHP mcrypt y openssl instaladas y habilitadas.
-
He leído todas las publicaciones del blog de Scott en Paragonie. El más relevante es Cómo generar de forma segura cadenas aleatorias y enteros en PHP .
Creo que mi mejor opción para crear un salt de contraseña en estas circunstancias es usar mcrypt para obtener bytes de / dev / urandom:
$salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM)
suponiendo que 16 bytes son apropiados para la sal. ¡La documentación de PHP ni siquiera dice si ese primer parámetro está en bytes! Pero parece ser así.
Tenemos unas decenas de millones de usuarios, por lo que permitir 100 millones de sales debería ser razonable.
Dadas mis limitaciones, ¿puede alguien sugerir un mejor enfoque que tomar 16 bytes aleatorios de / dev / urandom a través de la extensión mcrypt?
Para estar seguros, también estamos trabajando en otras actualizaciones para mejorar la disponibilidad de la biblioteca, un hash más fuerte, etc. Eso está fuera del alcance de esta pregunta.