【问题标题】:SCRAM-SHA-1 auth by PHPPHP 的 SCRAM-SHA-1 身份验证
【发布时间】:2015-12-20 03:45:24
【问题描述】:

请帮助我在 XMPP 服务器中实现有关 SCRAM-SHA-1 授权的手册中的语义代码。所以,我们得到了:

clientFinalMessageBare = "c=biws,r=" .. serverNonce
saltedPassword = PBKDF2-SHA-1(normalizedPassword, salt, i)
clientKey = HMAC-SHA-1(saltedPassword, "Client Key")
storedKey = SHA-1(clientKey)
authMessage = initialMessage .. "," .. serverFirstMessage .. "," .. clientFinalMessageBare
clientSignature = HMAC-SHA-1(storedKey, authMessage)
clientProof = clientKey XOR clientSignature
clientFinalMessage = clientFinalMessageBare .. ",p=" .. base64(clientProof)

我的 PHP 代码:

$cfmb = 'c=biws,r='.$salt;     
$saltpass = hash_pbkdf2('sha1', 'IDoMdGuFE9S0', $ps, $iter);        
//hash_pbkdf2('sha1', 'IDoMdGuFE9S0', $salt, $iter, 0, true); maybe like that???
$ckey = hash_hmac('sha1', $saltpass, 'Client Key');
$sckey = sha1($ckey);
$authmsg = $im.','.$chal.','.$cfmb;
$csign = hash_hmac('sha1', $sckey, $authmsg);
$cproof = bin2hex(pack('H*',$ckey) ^ pack('H*',$csign));
$cfm = $cfmb.',p='.base64_encode($cproof);

某处错误(可能是所有大错误;))我非常需要您的帮助来更正我的代码,也许我使用了错误的函数,或者错误位置的参数?因为结果 - 失败,服务器发送给我:

“客户端提供的响应与我们计算的不匹配。”

PS:对不起,我的英语不好;)

【问题讨论】:

    标签: php xmpp sasl sasl-scram


    【解决方案1】:

    首先,将$salt 用于serverNonce 和$ps 用于salt 非常令人困惑。

    但更重要的是,您应该注意跟踪您使用的函数是返回二进制数据还是十六进制编码字符串。 hash_pbkdf2sha1hash_hmac 默认返回十六进制编码字符串。您调用pack('H*', ...) 来解码它们以获得$cproof,但不是在您计算$ckey$csign 时。

    一种更简单的方法是直接计算二进制数据,始终传递$raw_data = TRUE

    $cfmb = 'c=biws,r='.$salt;     
    $saltpass = hash_pbkdf2('sha1', 'IDoMdGuFE9S0', $ps, $iter, 0, TRUE);        
    $ckey = hash_hmac('sha1', 'Client Key', $saltpass, TRUE);
    $sckey = sha1($ckey, TRUE);
    $authmsg = $im.','.$chal.','.$cfmb;
    $csign = hash_hmac('sha1', $authmsg, $sckey, TRUE);
    $cproof = $ckey ^ $csign;
    $cfm = $cfmb.',p='.base64_encode($cproof);
    

    此外,您的 hash_hmac 调用方式错误:首先是数据,然后是密钥。

    【讨论】:

    • 老哥,我在“stackoverflow.com/questions/29298346/…”看到你的评论,很想直接向你提问,但是没找到有私信的地方,你来了,谢谢!))是的, salt - 只是我在制作演示代码时的快速错误,我在发布我的信息后就明白了。所以,好的 - 我稍后会尝试你推荐的所有内容,然后在这里报告结果!
    • 你能再帮我一个问题吗,那么容易吗? stackoverflow.com/questions/32728223/…
    • 而还有什么不对...服务器第一条消息 - 是完整的块[ cj02ZDQ0MmI1ZDllNTFhNzQwZjM2OWUzZGNlY2YzMTc4ZWMxMmIzOTg1YmJkNGE4ZTZmODE0YjQyMmFiNzY2NTczLHM9UVNYQ1IrUTZzZWs4YmY5MixpPTQwOTY = 挑战> ] 还是 base64_decoded 内部字符串?关于初始消息的同样问题。关于最终结果的第二个问题 - MY_SEND_TO_SERVER_FUNCTION(''.base64_encode($cfm).'');正确的?或者我需要在发送之前对结果做更多​​的事情?
    • 服务器第一消息应该是 r=abcabcabc,s=QSXCR+Q6sek8bf92,i=4096 的形式。所以它不是 base64 编码的,也没有 XML。您的客户最终消息看起来正确。
    猜你喜欢
    • 2016-05-30
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 2022-07-14
    • 2019-05-07
    • 2016-06-09
    相关资源
    最近更新 更多