现在有很多不同的服务,谷歌API,Twitter API,Facebook API等等。
每项服务都有一个API密钥,例如:
AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q
所有密钥的长度和它们包含的字符各不相同,我想知道生成API密钥的最佳方法是什么?
我不是要求特定的语言,只是创建密钥的一般方法,如果它们是对用户应用程序的详细信息的加密,或者哈希,或随机字符串的哈希等等。我们应该担心关于哈希算法(MSD,SHA1,bcrypt)等?
修改 我和一些朋友(电子邮件/推特)进行了交谈,他们建议只使用带有短划线的GUID。
虽然这对我来说似乎有些苛刻,希望能有更多的想法。
答案 0 :(得分:37)
使用专为加密而设计的随机数生成器。然后base-64对数字进行编码。
这是一个C#示例:
var key = new byte[32];
using (var generator = RandomNumberGenerator.Create())
generator.GetBytes(key);
string apiKey = Convert.ToBase64String(key);
答案 1 :(得分:5)
我使用UUID,格式为小写,没有破折号。
生成很简单,因为大多数语言都内置了它。
API密钥可能会受到损害,在这种情况下,用户可能希望取消其API密钥并生成新密钥,因此密钥生成方法必须能够满足此要求。
答案 2 :(得分:1)
API密钥应该是一些随机值。足够随机,无法预测。它不应包含用户或帐户的任何详细信息。如果您确定创建的ID是随机的,那么使用UUID是个好主意。
例如,早期版本的Windows生成了可预测的GUID,但这是一个古老的故事。
答案 3 :(得分:1)
如果只需要一个字母数字字符的API密钥,则可以使用base64-random方法的一种变体,而只能使用base-62编码。 base-62编码器基于this。
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();
}