Pregunta: ¿Es esta técnica de autenticación API fácilmente pirateable?Diseño de autentificación API y hackability
apiKey = "123456789"
apiCallId = "1256341451"
apiSecret = "67d48e91ab2b7471d4be2a8c2e007d13"
sig = md5(apiKey + apiCallId + apiSecret) = 09c297a354219f173bfc49c2e203ce03
donde
apiKey
: algún identificador único para el usuarioapiCallId
: un número entero único que debe ser aumentado en valor (por ejemplo UNIX sello de tiempo)apiSecret
: cadena conocidos solamente para el usuario, y para nosotros, no pasó en la URLsig
: firma "no apta" de esta llamada API - MD5 hash
Ejemplo llamada a la API:
http://api.domain.com/?apiKey=123456789&apiCallId=1256341451&sig=09c297a354219f173bfc49c2e203ce03¶m1=x¶m2=y
Esta API no requiere una sesión, y no está diseñado para una tercera parte use en nombre de un usuario. En cambio, debe ser utilizado por el usuario.
Me gusta mucho la simplicidad de esto. El requisito de que apiCallId
sea único y siempre aumenta significa que no es posible reutilizar un sig
, por lo que me siento seguro (protegido contra ataques de repetición), pero no soy un experto.
Otras API utilizan todos los parámetros GET ordenados alfabéticamente al calcular el sig
, pero no veo por qué es necesario cuando se incluye apiCallId
.
Intente hackear esto ahora antes de implementarlo y liberarlo.
Agradezco cualquier comentario, sugerencia y educación de seguridad.
Respuesta impresionante, y me encantan los detalles técnicos. 'erickson' señaló que la interceptación (man-in-the-middle) es posible con lo anterior. ¿Tiene alguna recomendación de cómo prevenir este tipo de ataque? Supongo que esto va más allá de la pregunta original. ¿El uso de HTTPS (y no de HTTP) lo cubre? –
Si el MAC cubre todos los datos, _y _ no hay un segundo conjunto de entrada que canonicalice a la misma entrada al MAC (esto es importante, como aprendió Amazon), y se asegura de que no haya forma de hacer ataques de repetición (su contador esquema, implementado correctamente, parece estar bien), y su MAC es segura, entonces debe estar a salvo de MITM. Esto se debe a que un atacante no tiene opciones: pueden modificar un parámetro o valor API e intentar enviarlo, pero no habrá forma de que generen el valor MAC correcto, por lo que la llamada (debería ser) rechazada. –
Supongo que usted exige que la identificación de la llamada siempre se incremente en una tabla de base de datos. Solo tenga cuidado de actualizarlo solo al aceptar un mac válido. De lo contrario, cualquier atacante aleatorio podría enviar apiKey = your_id y apiCallId = 9999999999999999 ... y un valor MAC basura y causar una denegación de servicio fácil. En HTTPS: puede usarlo, hágalo; en primer lugar, protegerá la confidencialidad de las entradas API (y las respuestas RPC) y, en general, hará que los ataques a su esquema de autenticación sean mucho más difíciles. –