Encontré muchas API que le dan al usuario tanto una clave de API como un secreto . Pero mi pregunta es: ¿cuál es la diferencia entre ambos?
En mi opinión, una llave puede ser suficiente. Digamos que tengo una clave y solo yo y el servidor la conocemos. Creo un hash HMAC con esta clave y hago una llamada a la API. En el servidor, creamos el hash HMAC nuevamente y lo comparamos con el hash enviado. Si es lo mismo, la llamada está autenticada.
Entonces, ¿por qué usar dos llaves?
Editar: ¿ o se usa esa clave API para buscar el secreto de la API?
api
security
authentication
api-key
secret-key
ESTEGE
fuente
fuente
Respuestas:
La criptografía de clave secreta se basa en usar la misma clave para codificar y luego decodificar un mensaje. Por lo tanto, solo aquellos que conocen el "secreto" pueden leer el mensaje.
La seguridad RSA se basa en 2 claves coincidentes. Hay una clave pública para cada usuario y todos pueden (deberían) conocerla. También hay una clave privada que solo el usuario debe conocer. Un mensaje cifrado por la clave pública solo puede ser descifrado por la clave privada y viceversa.
Así, si quiero enviarte un mensaje que solo tú puedes leer, obtengo (de la red) tu clave pública, cifro el mensaje con esa clave y tú eres la única persona que puede descifrarlo.
O, si quiero probarte que envié un mensaje, puedo encriptar el mensaje con mi clave privada, decirte (en texto abierto o en otro mensaje) cómo fue encriptado. Luego, podría descifrar el mensaje con mi clave pública y, si se vuelve legible, sabrá que provino de mí.
Esta forma de encriptación es bastante intensiva en computadoras, por lo que lo que a veces se hace es encriptar una "clave secreta" de un solo uso con tecnología RSA, luego encriptar el resto del mensaje con la clave secreta y luego encriptar mi firma de la segunda manera. Luego invierte este proceso para que, si el mensaje y la firma son legibles, usted y solo usted puede leerlo y está seguro de que yo envié el mensaje.
O
puede visitar este enlace para obtener una explicación más detallada.
¿Cómo funcionan las claves API y las claves secretas?
fuente
Necesita dos claves separadas, una que les diga quién es usted y la otra que demuestre que es quien dice ser .
La "clave" es su ID de usuario y el "secreto" es su contraseña. Simplemente usan los términos "clave" y "secreto" porque así es como lo han implementado.
fuente
Bearer:
autenticación para eso? Allí tendrías una identificación y una pwd.Respuesta simple, si la entendí correctamente ...
Si usa su clave API para el cifrado, ¿cómo sabrá el servicio quién se está comunicando con ellos? ¿Cómo descifrarán ese mensaje?
Utiliza la clave API para indicar quién es, esto es lo que está enviando en texto sin formato. La clave SECRETA no le envía a nadie. Simplemente utilícelo para el cifrado. Luego envías el mensaje encriptado. No envía la clave que se utilizó para el cifrado, eso anularía el propósito.
fuente
secret
de texto sin formato. ¿Puedes darme un enlace? Lo que vi es usarsecret
para cifrar algunos datos. Y junto con los datos encriptados, enviandoapiKey
para que el servidor sepa cómo desencriptar los datos.secret
yapiKey
y lo que realmente está haciendo esusername
ypassword
. Que es una cosa completamente diferente ...Hay respuestas que explican qué es la clave secreta y (pública). Es un par de claves pública-privada al que le dan nombres confusos. Pero nadie dice por qué las API requieren ambos, ¡y muchas API solo le brindan un secreto! Tampoco he visto ningún documento de API que explique por qué tienen dos claves, así que lo mejor que puedo hacer es especular ...
Es mejor poner solo su clave pública en su solicitud y firmar la solicitud localmente con su clave privada; enviar nada más no debería ser necesario. Pero algunos se salen con la suya con solo tener el secreto en la solicitud. Ok, cualquier buena API usará alguna seguridad de transporte como TLS (generalmente sobre HTTPS). Pero todavía está exponiendo su clave privada al servidor de esa manera, lo que aumenta el riesgo de que de alguna manera la manejen mal (consulte: El error de registro de contraseñas de GitHub y Twitter descubierto recientemente). Y HTTPS es teóricamente igual de seguro, pero siempre existen fallas de implementación.
Pero muchas API, en realidad la mayoría, hacen que envíe ambas claves en las solicitudes, ya que es más fácil que hacer que las personas hagan sus propias firmas; de lo contrario, no se pueden tener ejemplos puros de cURL En ese caso, no tiene sentido separarlos. Supongo que las claves separadas son solo para en caso de que cambien la API más adelante para aprovecharlas. O algunos tienen una biblioteca cliente que podría hacerlo de manera más segura.
fuente
Una cosa que no vi que se menciona aquí, aunque es una extensión de la respuesta de Marcus Adams, es que no debería usar una sola pieza de información para identificar y autenticar a un usuario si existe la posibilidad de ataques de tiempo , que pueden utilice las diferencias en los tiempos de respuesta para adivinar hasta dónde llegó una comparación de cadenas.
Si está utilizando un sistema que usa una "clave" para buscar el usuario o la credencial, esa información podría adivinarse gradualmente con el tiempo enviando miles de solicitudes y examinando el tiempo que le toma a su base de datos encontrar (o no buscar) un registro. Esto es especialmente cierto si la "clave" se almacena en texto plano en lugar de un hash unidireccional de la clave. Querrá almacenar las claves de los usuarios en un texto plano o cifradas simétricamente si necesita poder mostrar la clave al usuario nuevamente.
Al tener una segunda información, o "secreto", primero puede buscar el usuario o la credencial usando la "clave", que podría ser vulnerable a un ataque de sincronización, luego use una función de comparación segura de sincronización para verificar el valor de el secreto".
Aquí está la implementación de Python de esa función:
https://github.com/python/cpython/blob/cd8295ff758891f21084a6a5ad3403d35dda38f7/Modules/_operator.c#L727
Y está expuesto en la
hmac
biblioteca (y probablemente en otros):https://docs.python.org/3/library/hmac.html#hmac.compare_digest
Una cosa a tener en cuenta aquí es que no creo que este tipo de ataque funcione con valores hash o cifrados antes de la búsqueda, porque los valores que se comparan cambian aleatoriamente cada vez que cambia un carácter en la cadena de entrada. Encontré una buena explicación de esto aquí .
Las soluciones para almacenar claves API serían:
De estos, creo que 3 es el mejor equilibrio entre seguridad y conveniencia. He visto esto implementado en muchos sitios web cuando se emiten claves.
Además, invito a cualquier experto en seguridad real a criticar esta respuesta. Solo quería sacar esto como otro punto de discusión.
fuente