【问题标题】:API Authentication using HMAC使用 HMAC 的 API 身份验证
【发布时间】:2015-05-27 04:06:50
【问题描述】:

在编写用于我们内部系统的简单 API 时,我正在寻找一种体面的身份验证方法。 Stack Overflow 上的其他问题建议使用 HMAC 以及指向教程的链接,我继续并决定实施。

设置后,我意识到我不确定这对于实际身份验证有多大意义。使用的教程Here 列出了客户端上的一个公共哈希,该哈希从未在服务器端代码中使用。它只是将内容和 privateHash 值散列在一起,并在服务器上进行比较。由于这一切都通过标头传递,我想知道这实际上有多安全?什么是 publicHash 值,因为它甚至似乎没有被使用?

客户:

<?php

$publicHash = '3441df0babc2a2dda551d7cd39fb235bc4e09cd1e4556bf261bb49188f548348';
$privateHash = 'e249c439ed7697df2a4b045d97d4b9b7e1854c3ff8dd668c779013653913572e';

$content = json_encode( array( 'test' => 'content' ) );

$hash = hash_hmac('sha256', $content, $privateHash);

$headers = array(
    'X-Public: '.$publicHash,
    'X-Hash: '.$hash
);

$ch = curl_init('http://domain.com/api2/core/device/auth');
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$content);

$result = curl_exec($ch);
curl_close($ch);

echo "RESULT\n======\n".print_r($result, true)."\n\n";

?>

服务器

function auth()
{
    $app = \Slim\Slim::getInstance();

    $request = $app->request();
    $publicHash = $request->headers('X-Public');
    $contentHash = $request->headers('X-Hash');
    $privateHash = 'e249c439ed7697df2a4b045d97d4b9b7e1854c3ff8dd668c779013653913572e';
    $content = $request->getBody();

    $hash = hash_hmac('sha256', $content, $privateHash);

    if ($hash == $combinedHash)
    {
        $data = array('status' => "success");
        response($data);
    }
    else
    {
        $data = array('status' => "failed");
        response($data);
    }
}

【问题讨论】:

    标签: authentication hash oauth-2.0 slim hmac


    【解决方案1】:

    我认为您发布的文章以令人困惑的方式使用了hash 一词。在文章中,$publicHash 是用户名,$privateHash 是用于签署有效负载的密钥。

    换句话说,就像文章所说的那样,X-Public 标头的值应该用于从数据库中查询用户特定的密钥。然后使用此密钥从有效负载创建散列。然后将此哈希与 X-Hash 标头的值进行比较。

    如果值匹配,那么您可以确定有效负载没有被篡改和/或有效负载的发送者知道密钥。

    这种方法不是无状态的。它要求您为每个请求访问数据库以找出当前用户的密钥。如果您的客户端不受信任(即启用 JavaScript 的浏览器),这也有点问题。不过对于机器对机器的通信来说效果很好。

    另类

    您可能想查看名为Using JSON Web Tokens as API Keys 的文章。 JSON Web Tokens 提供无状态解决方案。它们也是防篡改的,因为令牌是用 HMAC 签名/散列的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 2012-04-12
      相关资源
      最近更新 更多