Las respuestas a esta pregunta ¿Es correcto que el secreto de la API se almacene en texto sin formato o que pueda descifrar? es algo inquietante para mí. Estoy tratando de comprender cómo almacenar de forma segura una clave secreta en texto simple.
Así es como me imagino un sistema basado en clave de acceso / clave de acceso a API para funcionar:
- El cliente toma el texto de la solicitud y aplica la función HMAC con
secretKey
, lo que resulta ensignature
- El cliente agrega
signature
yaccessKey
a la solicitud (efectivamente como encabezados de autenticación) y envía al servidor - El servidor extrae
accessKey
de la solicitud y busca el correspondienteserverSecretKey
- El servidor toma el texto de la solicitud y aplica la función HMAC con la versión del servidor de
serverSecretKey
, lo que resulta enserverSignature
- El servidor compara
signature
conserverSignature
; si coinciden, genial, estamos bien, sabemos que el cliente tiene una clave de acceso válida y una clave secreta válida.
Entonces, antes de continuar, si lo anterior es incorrecto, entonces el resto de esta pregunta no tendrá ningún sentido, así que avíseme si la comprensión anterior de las claves de acceso / secreto de API es válida o no: )
Suponiendo que mi entendimiento es válido, mi pregunta vuelve a cómo se almacena la clave secreta - tiene para ser almacenada en texto sin formato para que funcione el sistema anterior.
Entonces, ¿qué sucede si un atacante obtiene acceso a mi base de datos que tiene todas mis claves de acceso API y mis claves secretas de mis clientes? ¿No podrían usar fácilmente cualquier combinación de clave secreta o de acceso que les guste y suplantar felizmente a cualquier cliente?
Lo estoy viendo desde la perspectiva de las contraseñas de bcrypt
. Si un atacante obtiene acceso a una base de datos con un montón de contraseñas de bcrypt
, tienen mucho trabajo por delante para hacer que esa base de datos valga la pena, ya que Brute forzó un conjunto. Las contraseñas incluidas en bcrypt
son computacionalmente caras. Eso se siente mucho más seguro que almacenar claves de API secretas en texto plano en alguna base de datos en algún lugar.
Parece que una combinación de clave de acceso / clave secreta API en realidad solo proporciona protección contra la manipulación de un mensaje (ya que la firma digital calculada durante los pasos 1 y 2 anteriores está vinculada a la clave secreta) y no la muestra. > realmente proporciona alguna garantía de que el cliente es quien dice ser. No veo cómo proporciona un nivel de seguridad comparable a las contraseñas de bcrypt
¿Qué me estoy perdiendo aquí?