生成API密钥的最佳方法

时间:2013-01-19 07:26:33

标签: security api-key

现在有很多不同的服务,谷歌API,Twitter API,Facebook API等等。

每项服务都有一个API密钥,例如:

AIzaSyClzfrOzB818x55FASHvX4JuGQciR9lv7q

所有密钥的长度和它们包含的字符各不相同,我想知道生成API密钥的最佳方法是什么?

我不是要求特定的语言,只是创建密钥的一般方法,如果它们是对用户应用程序的详细信息的加密,或者哈希,或随机字符串的哈希等等。我们应该担心关于哈希算法(MSD,SHA1,bcrypt)等?

修改 我和一些朋友(电子邮件/推特)进行了交谈,他们建议只使用带有短划线的GUID。

虽然这对我来说似乎有些苛刻,希望能有更多的想法。

4 个答案:

答案 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();
}