Una contraseña compartida es un diseño deficiente para administrar el acceso a un canal de comunicación privado. Por ejemplo, no puede expulsar a un usuario sin cerrar el canal: no puede hacer que olviden la contraseña. No puede evitar que un usuario comparta la contraseña con otros usuarios (de manera voluntaria o involuntaria): si la contraseña de un usuario está expuesta, puede invalidarla, pero si la contraseña compartida está expuesta, es un inconveniente para todos los que usaron esa contraseña. / p>
Un diseño mejor separaría la autenticación de la autorización . Primero autentique al usuario, por ejemplo, pidiéndole una contraseña ("¿Afirma que es Bob? ¡Pruébelo!"). Una vez que un usuario haya sido autenticado, determine a qué canales tiene acceso el usuario al buscarlo en una base de datos ("Vamos a ver si Bob debería tener acceso al canal loco del bucle zurdo").
Esta separación de inquietudes tiene muchas ventajas, pero tiene la consecuencia de que puede o no importarle: la manera fácil de hacerlo depende de una autoridad central para determinar quién tiene acceso al canal. El enfoque de contraseña compartida elimina esta autoridad central, pero al costo de tener una política de control de acceso bastante inflexible (cualquier usuario puede permitir que cualquier otro usuario se una, y solo el consenso total puede mantener al usuario fuera).
Si el canal realmente tiene que estar protegido por contraseña, porque esa política de control de acceso impar es lo que realmente desea, entonces debe responder dos preguntas:
- ¿Cómo se comunicará la contraseña a los nuevos participantes?
- ¿Espera que los usuarios vuelvan a escribir la contraseña cada vez que se unan?
Si la respuesta a (1) es que alguien tiene que saber la contraseña para divulgarla, entonces alguien tiene que almacenar la contraseña en una forma recuperable, por lo que el hashing no está disponible para quien da la contraseña. Si la respuesta a (2) es que los usuarios almacenan la contraseña en algún administrador de contraseñas, el hecho de incluir las contraseñas en el servidor de autenticación solo proporciona una pequeña cantidad de protección, pero sigue siendo una buena idea.
Siguiente pregunta: ¿qué tan grande es el problema si la contraseña es recuperable en el servidor? El hash de contraseña solo aborda una amenaza específica: si el adversario obtiene acceso de solo lectura a la base de datos. Si esto le permite al adversario recuperar contraseñas, entonces:
- Obtienen acceso al servicio.
- Obtienen acceso a otros servicios donde el mismo usuario ha usado la misma contraseña.
Para una contraseña compartida, (2) no se aplica, solo (1). Así que es menos importante que con las contraseñas para las cuentas de usuario. Hay una ventaja de almacenar la contraseña en forma de hash, pero no una decisiva.
Para abreviar una larga historia, una contraseña compartida no es un buen modelo. Si está atascado con él, hay una buena posibilidad de que tenga que almacenar la contraseña en una forma recuperable de todos modos, y no es su mayor problema. Rompe la contraseña si puedes, pero si no puedes, entonces no te quedes dormido al respecto.
Tenga en cuenta que si los usuarios pueden crear su propio canal protegido, no se les debe permitir seleccionar la contraseña. En mi experiencia, estas contraseñas compartidas son invariablemente difíciles de escribir, pero fáciles de forzar las contraseñas, como CraZyStraWs!!!1
. Genere automáticamente una contraseña aleatoria sensata (como 10 letras minúsculas seleccionadas de manera aleatoria) y obligue a los usuarios a usar esa.
Pero, en realidad, no use una contraseña compartida. Utilice una base de datos de acceso de usuario / canal.