Entonces, con muchos servicios diferentes actualmente, API de Google, API de Twitter, API de Facebook, etc.
Cada servicio tiene una clave API, como:
AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q
Todas las claves varían en longitud y los caracteres que contienen, me pregunto cuál es el mejor enfoque para generar una clave API.
No estoy pidiendo un lenguaje específico, solo el enfoque general para crear claves, en caso de que sean un cifrado de los detalles de la aplicación del usuario, o un hash, o un hash de una cadena aleatoria, etc. ¿Deberíamos preocuparnos por el algoritmo hash? (MSD, SHA1, bcrypt), etc.
Editar: he hablado con algunos amigos (correo electrónico / twitter) y me recomendaron usar un GUID con los guiones eliminados.
Sin embargo, esto me parece un poco complicado, con la esperanza de obtener algunas ideas más.
Respuestas:
Utilice un generador de números aleatorios diseñado para criptografía. Luego, codifica el número en base 64.
Este es un ejemplo de C #:
var key = new byte[32]; using (var generator = RandomNumberGenerator.Create()) generator.GetBytes(key); string apiKey = Convert.ToBase64String(key);
fuente
apiKey
podría declararse en otro lugar. Agregué el tipo para mayor claridad.Las claves de API deben tener las propiedades que:
Por lo general, tendrá miles o millones de claves de API, no miles de millones, por lo que no es necesario que:
Como tal, una forma de generar una clave API es tomar dos piezas de información:
y firmarlos utilizando un secreto privado.
El contador garantiza que identifican de forma única al usuario y la firma evita la falsificación. La revocabilidad requiere verificar que la clave aún sea válida en la base de datos antes de hacer cualquier cosa que requiera autorización de clave API.
Un buen generador de GUID es una aproximación bastante buena de un contador incrementado si necesita generar claves desde varios centros de datos o no tiene una buena forma distribuida de asignar números de serie.
El hash no evita la falsificación. Firmar es lo que garantiza que la clave vino de usted.
fuente
Utilizo UUID, formateados en minúsculas sin guiones.
La generación es fácil ya que la mayoría de los idiomas lo tienen integrado.
Las claves de API pueden verse comprometidas, en cuyo caso un usuario puede querer cancelar su clave de API y generar una nueva, por lo que su método de generación de claves debe poder satisfacer este requisito.
fuente
UUID uuid = UUID.randomUUID();
en Java? ¿Estás diciendo que el azar no es lo suficientemente bueno?Si desea una clave de API con solo caracteres alfanuméricos, puede usar una variante del enfoque base64-random , solo usando una codificación base-62 en su lugar. El codificador base-62 se basa en esto .
public static string CreateApiKey() { var bytes = new byte[256 / 8]; using (var random = RandomNumberGenerator.Create()) random.GetBytes(bytes); return ToBase62String(bytes); } static string ToBase62String(byte[] toConvert) { const string alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; BigInteger dividend = new BigInteger(toConvert); var builder = new StringBuilder(); while (dividend != 0) { dividend = BigInteger.DivRem(dividend, alphabet.Length, out BigInteger remainder); builder.Insert(0, alphabet[Math.Abs(((int)remainder))]); } return builder.ToString(); }
fuente
Una clave de API debe ser un valor aleatorio. Lo suficientemente aleatorio como para que no se pueda predecir. No debe contener ningún dato del usuario o de la cuenta a la que pertenece. Usar UUID es una buena idea, si está seguro de que los ID creados son aleatorios.
Las versiones anteriores de Windows producían GUID predecibles, por ejemplo, pero esta es una vieja historia.
fuente