Estoy trabajando en un proyecto (que no es de alta seguridad) que actualmente no está activo, pero podría estar activo en algún momento.
Tenemos una API REST (implementada mediante Restlet y Neo4j) que se ejecuta en un servidor y una aplicación cliente de Android.
Para mantener las cosas sin estado, debemos enviar información de autenticación junto con cada solicitud. Decidimos utilizar un enfoque basado en MAC: firmamos un conjunto de valores de encabezado, así como el cuerpo de la entidad de cada solicitud HTTP utilizando el algoritmo HMAC-SHA256. Luego ponemos ese hash junto con el nombre de usuario en el encabezado Authorization
de la solicitud.
Para el secreto de HMAC, usamos una contraseña elegida por el usuario. Para hacer que las cosas sean más seguras, cambiamos la contraseña antes de usarla y almacenarla en el cliente.
Por supuesto, para que el servidor pueda validar el encabezado HMAC-SHA256, necesitamos transmitir el secreto una vez. Pero como esto solo ocurre una sola vez, no es un gran riesgo de seguridad.
El problema con esta configuración es el almacenamiento seguro de las contraseñas de los usuarios. Sé que las contraseñas nunca se deben cifrar sin usar un salt para evitar ataques a la tabla del arco iris. Pero cuando genero un salt seguro / aleatorio, un cliente que registra un usuario por primera vez no tiene manera de acceder a ese salt para generar el hash correcto.
¿Cuál sería la mejor decisión en este caso? ¿Debería simplemente almacenar las contraseñas usando un algoritmo de hashing "convencional" como SHA256 sin usar un salt? Supongo que eso sería muy negligente. También podría usar un algoritmo más seguro como bcrypt o PBKDF2 con un "dummy salt" como el nombre de usuario , un hash MD5 del nombre de usuario y un recuento de iteraciones más alto. Aunque la sal es conocida, sería muy lento y doloroso generar tablas de arco iris.
¿Bcrypt con una sal de "seguridad por oscuridad" sería lo suficientemente segura? ¿O es toda la configuración insegura y debería intercambiarse con otro método de autenticación?