Tanto el uso aleatorio de sal como varios cálculos de hash u otra estrategia de retardo (bcrypt, scrypt, lo que sea) tiene sentido no solo para muchos usuarios, sino también para un usuario.
Salt evita que un atacante ingrese trivialmente su hash en Google para obtener una contraseña instantánea sin siquiera usar una herramienta. Una buena sal aleatoria hace que sea menos probable que haya elegido una que alguien más haya creado una tabla de arco iris para el valor de todos modos (por ejemplo, para algunas sales obvias que podría ver, como los ID de usuario).
Tener una sal aleatoria diferente para cada usuario evita que un atacante reutilice los hash en una tabla de arco iris (o que use una tabla de arco iris para una sal específica que ya existe). Fuerza a la fuerza bruta de cada usuario individual. No puedes evitar que alguien continúe con un ataque de fuerza bruta, y eventualmente tendrá éxito (ya que incluso las contraseñas "fuertes" son relativamente débiles). Pero cuanto más tiempo le toma a un usuario de fuerza bruta, más seguros están los restantes (si se requieren 2 segundos para un usuario de fuerza bruta, puede hacer 1000 usuarios en unas pocas horas, si se tarda una semana por usuario, Las cosas se ven mucho mejor). Ese es el punto central de usar algo como bcrypt.
Ahora, si hay solo un usuario , forzar brutalmente al primer usuario significa un compromiso del 100%.
Por lo tanto, usar una estrategia que retrase la fuerza bruta es al menos tan importante como con una base de datos de muchos usuarios (pero, conceptualmente, más importante).
Algo como un GUID funcionará bien, no importa si almacena la "cadena" en algún lugar o si la reutiliza cuando el mismo usuario cambia la contraseña. Una sal debe ser accesible de alguna forma para que pueda validar la contraseña. Claro, sería bueno que lo mantuvieras en secreto, pero eso no es posible ni necesario para su propósito. Además, si alguien puede robar la sal, también tendrá la contraseña de hash, ya que generalmente se almacena en el mismo lugar. En la medida en que no exista un "riesgo adicional" de que alguien pueda preparar una mesa de arco iris con anticipación para esa sal conocida (antes de robar la contraseña real). Dicho esto, si te sientes incómodo, realmente no cuesta nada cambiar también la sal cada vez que el usuario cambia la contraseña.
El propósito de la sal no es el cifrado de algún tipo, sino el de frustrar las tablas del arco iris, lo que hace que la inversión del hash sea una operación trivial.
En principio, hardcoding una sal "elegida al azar" directamente como usted propone sería igual de buena para su escenario de un solo usuario. Sin embargo, este es un mal enfoque ya que existe la posibilidad de que eventualmente reutilices el código para otra cosa (un proyecto diferente tuyo) o que eventualmente tengas más de un usuario.
Es posible que no veas esto en este momento, pero generalmente es una posibilidad.
Ahora, lo que sucede con las cosas que pueden suceder es que eventualmente sucederán . Por lo tanto, si codifica directamente una única sal, ya que de todos modos solo hay un usuario, eventualmente tendrá un agujero de seguridad, tal vez dentro de 10 años, cuando ya no lo piense más.
Tan pronto como use la misma sal para varios usuarios o para un solo usuario en varios proyectos, es bastante inútil. Simplemente no debe permitir que eso suceda.
Lo mismo se aplica, por supuesto, al enfoque de tener una sal "permanente" que se usa en todas partes, por ejemplo, por el resto de su vida. Esta es una invitación abierta para construir una tabla de arco iris, ya que al hacerlo se ahorrará trabajo computacional. Atacar una de sus contraseñas será más o menos la misma carga de trabajo que atacar todas las contraseñas en su vida.