it-swarm-eu.dev

Jak by se měly generovat klíče API?

Chci se ujistit, že žádosti nelze zfalšovat a odeslat na můj server. K tomu potřebuji vygenerovat API klíč na uživatele v mém systému. Účelem tohoto klíče bude podepsat žádosti na straně klienta a ověřit je na serveru.

Otázka zní, z čeho jsou klíče API obvykle tvořeny? Jsou to jen kryptograficky bezpečné náhodné číslo (podobné soli se heslem)? Nebo je za nimi nějaká logika, např. pokud by se skládaly z údajů specifických pro uživatele.

V mém systému již každý uživatel má jedinečné ID (GUID), které není veřejně vystaveno, mohl bych to použít jako svůj „klíč“ nebo by se měl API API lišit od ID uživatele?

31
James

Záleží na tom, jak moc chcete oddělit role.

Základní systém: Váš „podpis“ je MAC . „Klíč API“ je tajná hodnota, se kterou se sdílí server a uživatel. Normální MAC algoritmy jako HMAC mohou používat libovolné sekvence bitů jako klíč, takže klíč lze snadno vygenerovat pomocí /dev/urandom (Linux, * BSD , MacOS X), volání CryptGenRandom() (Win32) nebo pomocí Java.security.SecureRandom (Java).

Vylepšený systém: váš podpis je skutečný digitální podpis . To má smysl, pokud chcete oddělit generátor klíčů (který může vytvářet klíče, které bude server akceptovat), od samotného serveru (který ověřuje příchozí podpisy). Klíče pro algoritmy podpisu jsou matematické objekty se spoustou vnitřní struktury a každý algoritmus zahrnuje specifický algoritmus generování klíčů. Použijte knihovnu, která již implementuje potřebné bity (např. OpenSSL ).


V každém případě je toho více než jen generování klíčů a podpisy. Například se pravděpodobně chcete vyhnout opakované útoky: špatně zamýšlená třetí strana špehuje v síti a zaznamenává platnou žádost podepsanou běžným uživatelem. Útočník později odešle požadavek znovu, doplněný jeho podpisem, aby se účinek replikoval. Abyste se vyhnuli opakovaným útokům, musíte přidat nějaký externí protokol a tyto věci je obtížné udělat (není těžké definovat protokol; je velmi obtížné definovat zabezpečené] protokol). Chytrá věc je proto opětovné použití existujícího, dobře prověřeného protokolu, což v praxi znamená SSL/TLS .

U SSL je „základní systém“ omezen na odesílání klíče API v záhlaví na začátku konverzace (to je přesně to, co se děje při ověřování hesla na webech HTTPS). "Rozšířený systém" je pak "SSL s klientským certifikátem".

24
Thomas Pornin