因此,现在有很多不同的服务,谷歌API,Twitter API,Facebook API等.
每个服务都有一个API密钥,如:
AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q
所有密钥的长度和它们包含的字符各不相同,我想知道生成API密钥的最佳方法是什么?
我不是要求特定的语言,只是创建密钥的一般方法,它们是用户应用程序的详细信息加密,哈希,或随机字符串的哈希等等.我们应该担心哈希算法(MSD,SHA1,bcrypt)等?
编辑: 我已经和一些朋友(电子邮件/推特)进行了交谈,他们建议只使用带有短划线的GUID.
这对我来说似乎有些惹人注意,希望能得到更多的想法.
Edw*_*rey 45
使用专为加密设计的随机数生成器.然后base-64对数字进行编码.
这是一个C#示例:
var key = new byte[32];
using (var generator = RandomNumberGenerator.Create())
generator.GetBytes(key);
string apiKey = Convert.ToBase64String(key);
Run Code Online (Sandbox Code Playgroud)
Mik*_*uel 25
API密钥需要具有以下属性:
通常,您将拥有数千或数百万个API密钥,而不是数十亿,因此他们不需要:
因此,生成API密钥的一种方法是获取两条信息:
并使用私人秘密签名.
计数器保证他们唯一地识别用户,并且签名防止伪造.Revocability要求在执行需要API密钥授权的任何操作之前检查密钥在数据库中是否仍然有效.
如果您需要从多个数据中心生成密钥或者没有其他良好的分布式方式来分配序列号,那么良好的GUID生成器是增量计数器的非常好的近似值.
或随机字符串的散列
哈希不会阻止伪造. 签名是保证钥匙来自你的原因.
Chr*_*son 16
2023 注意:在 Chrome 中,默认的新标签页不允许在控制台中使用加密模块,因此请使用其他页面。
更新,在 Chrome 的控制台和 Node.js 中,您可以发出:
crypto.randomUUID()
Run Code Online (Sandbox Code Playgroud)
输出示例:
4f9d5fe0-a964-4f11-af99-6c40de98af77
Run Code Online (Sandbox Code Playgroud)
原答案(更强):
您可以通过在任何网站上打开一个新选项卡(请参阅本答案顶部的 2023 年注释)来尝试 Web 浏览器控制台,在 Chrome 上按 CTRL + SHIFT + i,然后输入以下立即调用函数表达式 (IIFE):
(async function (){
let k = await window.crypto.subtle.generateKey(
{name: "AES-GCM", length: 256}, true, ["encrypt", "decrypt"]);
const jwk = await crypto.subtle.exportKey("jwk", k)
console.log(jwk.k)
})()
Run Code Online (Sandbox Code Playgroud)
输出示例:
gv4Gp1OeZhF5eBNU7vDjDL-yqZ6vrCfdCzF7HGVMiCs
Run Code Online (Sandbox Code Playgroud)
参考:
https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/generateKey
https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/exportKey
我承认我写这篇文章主要是为了自己以后参考......
如果您想要一个只有字母数字字符的 API 密钥,您可以使用base64-random方法的变体,只使用 base-62 编码。base-62 编码器基于此。
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();
}
Run Code Online (Sandbox Code Playgroud)
我使用UUID,格式为小写,没有破折号.
生成很容易,因为大多数语言都内置了它.
API密钥可能会受到损害,在这种情况下,用户可能希望取消其API密钥并生成新密钥,因此密钥生成方法必须能够满足此要求.