我想创建一个安全的REST API
例如,如果我看到谷歌API,则会根据域生成API KEY。
从这里我得到了两个问题:首先,使用单向散列是真/右吗?如果是,如果有人知道散列方法和域,那么他可以生成api密钥并使用它。以及我可以使用的哈希方法/功能?
第二个是,如果客户端如何制作桌面应用程序,如何生成从桌面访问的API KEY,现在是具有域URL的网站。我的意思是,他们可以生成api密钥,因为没有网址。
有什么好方法吗?,如何创建安全api以及如何创建api密钥?
顺便说一句,我正在使用PHP
答案 0 :(得分:3)
你可以使用和混合许多哈希方法和额外的盐,这可以基于域+其他逻辑,非常难以猜测或破解(取决于你的哈希算法)将使用和其他东西),除非有人知道它是如何完成的。 您也可以生成UUID并将其用作api密钥(可能我会使用它),例如http://en.wikipedia.org/wiki/Uuid版本4,您可以检查它的实现细节,甚至可以轻松地考虑一些改进。
不太清楚你的意思。
答案 1 :(得分:2)
如果您计划使用单向哈希,那么您一定要考虑腌制。您可以生成类似10个字符的随机字符串(这将是您的盐),或者将salt附加或添加到域(您最初想要散列的内容),然后通过您选择的单向散列算法传递它。
我猜你正在将API密钥存储在某种数据库中。您将首先执行我上面解释的操作,然后将您的salted和哈希密码与您生成的随机盐一起存储在数据库中。这样,如果有人知道你正在使用的哈希算法,他们仍然需要得到盐。如果你随机制作盐(就像我之前说过的那样),他们很可能无法猜到它:)
如果您计划使用此方法,还有一个额外步骤。检查API密钥是否正确时,您将获取给定的API密钥,遍历您的表并查找您在该API密钥上使用的盐(您可以使用用户的用户名查询该表),将该盐附加或添加到key,然后通过相同的散列算法发送它。如果它与数据库中的匹配,则它是正确的密钥!
希望这有帮助! :)
答案 2 :(得分:1)
好的,所以如果你有一个存储API密钥的数据库表和使用它们的客户端,你可以为所有客户端构建唯一的密钥。您可以轻松地随机化字符,可选地将它们哈希并将其存储为密钥。
例如
$length = 16; // 16 Chars long
$key = "";
for ($i=1;$i<=$length;$i++) {
// Alphabetical range
$alph_from = 65;
$alph_to = 90;
// Numeric
$num_from = 48;
$num_to = 57;
// Add a random num/alpha character
$chr = rand(0,1)?(chr(rand($alph_from,$alph_to))):(chr(rand($num_from,$num_to)));
if (rand(0,1)) $chr = strtolower($chr);
$key.=$chr;
}
如果要哈希,可以使用MD5或SHA1,但需要在数据库中进行反向比较,例如
SELECT * FROM api_keys where MD5(key) = INPUT
我希望这会有所帮助
答案 3 :(得分:0)
此函数每次都会返回Random字符串。这将通过调用两次并将值存储到变量中来帮助您生成API密钥和秘密。这是每次生成新密钥时生成的简单方法..
function generateRandomString($length = 30)
{
$characters='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0987654321'.time();
$charactersLength = strlen($characters);
$randomString = '';
for ($i = $length; $i > 0; $i--)
{
$randomString .= $characters[rand(0, $charactersLength - 1)];
}
return $randomString;
}
I think this is simple and usefully.