2011-06-04 56 views
2

看着谷歌,找不到任何东西。用API密钥开发服务(起点)

任何良好的资源开始设计我的后端的RESTless Web应用程序将严重依赖API密钥。

我知道如何编写不安定的web服务等,只是从来没有使用API​​密钥。通常人们只是为用户生成指导等等?

回答

2

GUID通常不是“随机”的,并且很容易被坏人猜出。

采取一些“随机”数据,如用户的密码散列,一些随机数,并通过sha1或类似的散列函数运行结果。

如果您想为每个帐户使用一个API密钥,只需将其添加到帐户元数据表即可。否则,使用链接到accountIds的表来存储API密钥。

服务器端使用api-key作为临时存储帐户元数据的密钥,因此您只需在每个会话中转到一次db。

当然,所有事情都必须通过https来避免API密钥被盗。

现在,如果您的服务是面向“会话”的,您可以考虑使用临时会话密钥,因此您不需要公开API密钥。寻找公钥加密来进一步调查。

+0

“GUID是通常不是随机的不够,可以很容易地猜到”?我不确定我是否同意这一点。 http://stackoverflow.com/questions/184869/are-guid-collisions-possible – toxaq 2015-01-17 04:47:06

+0

部分GUID与机器相关,通常是IP或MAC地址,一天中的时间,生成UID的对象的地址,序列计数器。这使得在正常使用情况下生成相同ID的天文数字不太可能。然而,想要创建冲突的攻击者可以使用另一个GUID来确定公共位,并猜测“变化”位,这是一个相对较小的子集,它更容易暴力破解。其实你提到的问题的答案,很好地说明了这一点。 – 2015-01-18 15:13:46

+0

虽然我不相信UUID v4仍然如此,但它应该完全是“随机的”,并且是应该使用的。你的假设是一个GUID不适合API密钥? – toxaq 2015-01-18 21:41:27

4

下面是我如何创建API密钥的Web服务:

string CreateApiKey(int length) 
{ 
    var bytes = new byte[length * 2]; 
    using (var rng = new RNGCryptoServiceProvider()) 
     rng.GetBytes(bytes); 
    var chars = Convert.ToBase64String(bytes) 
     .Where(char.IsLetterOrDigit) 
     .Take(length) 
     .ToArray(); 
    var key = new String(chars); 
    return key; 
}