Estoy tratando de diseñar un esquema de seguridad que involucre un secreto compartido pero no es una situación de contraseña de cuenta tradicional. El servidor almacenaría un conjunto de "claves", cada una de las cuales tiene un blob de datos asociado. Para que cualquiera pueda acceder a los datos de una clave determinada, todo lo que necesitan saber es el nombre de texto simple de la clave. Entonces, si Alice crea datos usando "piña" como la clave, Bob puede pedirle al servidor los datos para la clave "piña" y el servidor devolverá los datos.
Es completamente intencional que Bob pueda compartir la palabra secreta con otras personas, o que las personas adivinen al azar "piña" y obtengan los datos accidentalmente. Solo quiero evitar que alguien sea capaz de usar bruta forzando fácilmente un gran número de claves para palabras comunes del diccionario. Me gustaría que ninguno de los datos de texto simple se envíe al servidor, de modo que las personas que ejecutan el servidor no puedan espiar los datos del usuario ni saber cuáles son las claves de texto simple. E idealmente, si el servidor estuviera comprometido, llevaría mucho tiempo forzar bruscamente cada una de las claves de texto sin formato y / o descifrar los datos correspondientes.
Mi idea de cómo podría funcionar esto es que si Alice quiere crear nuevos datos, su cliente toma la "piña" clave y ejecuta un algoritmo hash muy lento, creando el código hash correspondiente para la piña. Luego, su cliente encripta el paquete de datos con "piña" y también utiliza algún tipo de método de encriptación que es difícil de forzar. Alice enviaría ambos al servidor, que verificará que el hash no exista, y luego almacenará el hash / par de datos. Más tarde, Bob podría repetir el mismo proceso de creación de un código hash para la piña, luego pedirle al servidor los datos para ese hash y finalmente descifrar los datos devueltos utilizando la piña como la clave. El proceso de creación del hash inicial sería lento, pero tanto Alice como Bob podrían almacenarlo localmente en su cliente, por lo que solo habría que hacerlo una vez por clave.
¿Hay alguna forma mejor de hacer esto? ¿Hay algoritmos de hash lentos que no impliquen el uso de sal, lo que evitaría que Alice y Bob descubran el mismo código hash seguro sin comunicarse entre sí? ¿Hay alguna forma de utilizar un archivo sal, pero sigue utilizando este método general en el que el servidor nunca ve ningún texto sin formato? ¿Hay problemas de seguridad con este tipo de esquema que no estoy considerando?