¿Debo hacer un hash o cifrar las claves API antes de almacenarlas en una base de datos?

3

Estoy asegurando las llamadas a la API a un servicio REST que estoy creando usando las claves de la API. El plan es:

  1. Cuando obtengamos un nuevo cliente, generamos una clave API (un UUID).
  2. Envíeles la clave API por correo electrónico.
  3. Envían la clave API en cada llamada a nuestro servicio (a través de HTTPS). Buscaremos la clave de la API en nuestra base de datos (ya sea cifrándola o modificándola por hash primero) y descubriremos para qué cuenta está la clave de la API.

Eventualmente, agregaremos cuentas de usuario y un portal para todo esto para que los clientes puedan generar y desactivar las claves de API sin que sea necesario que participemos.

Mi pregunta está en la última parte. ¿Debo hash o cifrar (o dejar sin cifrar) las claves de la API antes de almacenarlas en la base de datos? Estoy tratando de entender las implicaciones. Sé que si los hago, entonces estoy protegiéndome contra alguien que conozca todas las claves API si obtienen acceso a la base de datos. Pero, ¿en qué otras cosas debería estar pensando? Por ejemplo, ¿hay razones de rendimiento para hacer una sobre la otra?

    
pregunta Daniel Hipke 23.02.2018 - 00:53
fuente

2 respuestas

1

Sí, absolutamente debe hash sus claves API. En efecto, son sus contraseñas y deben tratarse como tales. Y tenga en cuenta que es hash, no encriptado. Nunca es necesario descifrar las claves de la API, por lo que no debería poder hacerlo.

Como dice saghaulor , debes asegurarte de usar un UUID de la versión 4 (uno al azar, que is) y que utiliza una fuente de aleatoriedad criptográficamente segura al generarlos. Ya que un UUID generado correctamente contiene 122 bits de entropía no debe preocuparse por el uso de sal o utilizar un hash lento Funciona como bcrypt. Una sola ronda de SHA-256 sería suficiente.

Una parte problemática de su diseño es que le está dando a los usuarios "contraseñas" que se entregan por correo y que no se pueden cambiar. Eso puede no ser lo suficientemente bueno para usuarios conscientes de la seguridad. Quizás el portal que mencionas resolverá este problema.

    
respondido por el Anders 23.02.2018 - 10:27
fuente
1

1) Asegúrese de utilizar un generador aleatorio seguro para generar su UUID.

2) No envíe la clave API por correo electrónico. El correo electrónico no tiene garantía de transporte seguro, es decir, es probable que esté enviando la clave de forma clara.

3) La forma en que implementes el mecanismo de autenticación afectará la forma en que puedes almacenar la clave API.

Si va a utilizar la clave API como clave principal, entonces no puede hacer un hash o cifrarlo, ya que la búsqueda es efectivamente imposible si hash o cifrado correctamente.

Si lo que le proporciona al usuario es una combinación de clave principal y clave API, puede almacenar la clave API de forma segura. Como la clave es efectivamente una contraseña, el hash debería ser suficiente y se recomienda.

Recuerda usar el algoritmo correctamente. Generalmente, el hashing requiere una sal para cada registro. Hay diferentes algoritmos de hash. Algunos, como bcrypt y scrypt, pueden agregar latencia artificial para disminuir la fuerza bruta. Esto puede o no ser adecuado para su caso de uso. Algunos algoritmos no se recomiendan, como MD5 y SHA1, ya que se ha demostrado que son inseguros.

Podría codificar la clave sin sal y, a continuación, puede realizar búsquedas simples. Esto no será tan seguro como el hash con sal, pero la seguridad de dicho enfoque puede ser suficiente para sus propósitos.

    
respondido por el saghaulor 23.02.2018 - 02:04
fuente

Lea otras preguntas en las etiquetas