Me suena bien. Responderé a tus preguntas y agregaré algunos pensamientos:
1) Puedes ejecutar mil millones de iteraciones de pbkdf2, pero si su contraseña es un solo carácter, no ayudará mucho. ¿Esto cambia si hay una política de contraseña obligatoria que garantice al menos contraseñas relativamente sanas?
Personalmente odio las políticas de contraseña, pero no soy tu usuario promedio. Podría considerar advertirles (decir que 8 caracteres sin diccionario es una contraseña razonable) pero de lo contrario, déjelos en libertad para que hagan lo que quieran. Tal vez cuando intenten usar una contraseña de 3 caracteres o menos, muestren una ventana emergente que "apesta", ¿quizás quiera dejar el archivo sin cifrar en su lugar? [Y / n] ";)
2) Técnicas alternativas de generación de claves?
Consulte ¿Cómo hash seguro de contraseñas? para obtener algunas ideas. No son estrictamente funciones de derivación de claves, pero creo que puedes usar cosas como scrypt y bcrypt de la misma manera.
4) Esto proporciona un método de ataque sin conexión para obtener su contraseña para el servicio que tiene acceso a mucho más que solo este archivo. Parece que esto agrega un riesgo sustancial. ¿Pensamientos?
¡Buen punto! No permite el craqueo fuera de línea, pero solo para un usuario. En el caso de que el archivo de contraseña sea robado, el atacante probablemente podría modificar el dispositivo para incluir un keylogger de todos modos.
3) ¿Pensamientos / sugerencias generales?
-
Además de una función de derivación de clave, también observa cómo cifras el archivo. Querrá usar cifrado autenticado, o al menos, un modo de operación de cifrado por bloques (es decir, no utilice el BCE).
-
También puede cifrar el archivo con una clave generada aleatoriamente (utilizando un CSPRNG) y luego cifrar esa clave con la contraseña del usuario. Si el usuario desea cambiar la contraseña, puede hacerlo sin volver a cifrar todos los datos. Solo tienes que volver a cifrar la clave.
-
A los usuarios no les gusta cuando no hay la opción "Olvidé mi contraseña". Estoy a favor de decir "así es como debería funcionar cada servicio de almacenamiento de archivos, así que deje de quejarse", pero eso simplemente no es aceptable para muchas compañías. Puede cifrar la clave (ver mi punto anterior) no solo con la contraseña del usuario, sino también por separado con su clave pública. Luego, la función de restablecimiento de contraseña puede usar la clave privada (almacenada solo en el servidor) para descifrar la clave y permitir el restablecimiento de la contraseña. Sin embargo, esto también significa que tiene acceso a los datos del usuario.