gpt4 book ai didi

authentication - XMPP SASL SCRAM-SHA1 认证

转载 作者:行者123 更新时间:2023-12-03 23:59:48 26 4
gpt4 key购买 nike

最近,我能够按照以下两个网站上的说明在 Swift IOS 中获得适用于 XMPP 流的 MD5 身份验证(我使用 Apple 的 CommonCrypto C 库的 CC-MD5 函数进行实际散列):

http://wiki.xmpp.org/web/SASLandDIGEST-MD5

http://www.deusty.com/2007/09/example-please.html

我正在寻找有关如何使其他散列 SASL 身份验证方案工作的类似解释,尤其是 SCRAM-SHA1。我找到了官方RFC5802文档,但我在理解它时遇到了很多麻烦(它也不是 XMPP 特有的)。我希望有一个更简单的解释或一些简单易读的代码(C、PHP、C++、Javascript、Java)特定于 XMPP 身份验证,这些代码除了实际散列之外不使用任何库。

我有兴趣了解该过程,并且不打算使用 ios XMPP-Framework。任何帮助,将不胜感激。

最佳答案

SCRAM-SHA-1

这种机制如何工作的基本概述是:

  • 客户端发送它想要验证的用户名。
  • 服务器发回该用户的盐和迭代次数(通过生成它们或在其数据库中查找给定用户名的盐)。
  • 对于给定的迭代次数,客户端使用给定的盐对密码进行哈希处理。
  • 客户端将结果发回。
  • 服务器执行散列的变体并将其结果发送回客户端,因此客户端还可以验证服务器是否具有密码/密码的散列。

  • 您需要的加密算法是 SHA-1、带有 SHA-1 的 HMAC 和 PBKDF2与 SHA-1。您应该查看如何在您的语言/框架中使用它们,因为我不建议从头开始实现它们。

    详细
  • 首先规范化密码(使用 SASLprep ),这将是 normalizedPassword .这是为了确保 UTF8 编码不能包含相同密码的变体。
  • 选择一个随机字符串(例如 32 个十六进制编码字节)。这将是 clientNonce .
  • initialMessage"n=" .. username .. ",r=" .. clientNonce (我使用 .. 进行字符串连接)。
  • 客户端将 GS2 header ( "n,," ) 添加到 initialMessage 并对结果进行 base64 编码。它将此作为它的第一条消息发送:

    <auth xmlns="urn:ietf:params:xml:ns:xmpp-sasl" mechanism="SCRAM-SHA-1">
    biwsbj1yb21lbyxyPTZkNDQyYjVkOWU1MWE3NDBmMzY5ZTNkY2VjZjMxNzhl
    </auth>
  • 服务器以质询作为响应。挑战的数据是base64编码的:

    <challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
    cj02ZDQ0MmI1ZDllNTFhNzQwZjM2OWUzZGNlY2YzMTc4ZWMxMmIzOTg1YmJkNGE4ZTZmODE0YjQyMmFiNzY2NTczLHM9UVNYQ1IrUTZzZWs4YmY5MixpPTQwOTY=
    </challenge>
  • 客户端 base64 对其进行解码:
    r=6d442b5d9e51a740f369e3dcecf3178ec12b3985bbd4a8e6f814b422ab766573,s=QSXCR+Q6sek8bf92,i=4096
  • 客户端解析这个:
  • r=这是serverNonce .客户端必须确保它以 clientNonce 开头。它发送了它的初始消息。
  • s=这是salt , base64 编码(是的,这是 base64 编码两次!)
  • i=这是迭代次数,i .
  • 客户端计算:
    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
    serverKey = HMAC-SHA-1(saltedPassword, "Server Key")
    serverSignature = HMAC-SHA-1(serverKey, authMessage)
    clientFinalMessage = clientFinalMessageBare .. ",p=" .. base64(clientProof)
  • 客户端 base64 编码 clientFinalMessage并将其作为响应发送:

    <response xmlns="urn:ietf:params:xml:ns:xmpp-sasl">
    Yz1iaXdzLHI9NmQ0NDJiNWQ5ZTUxYTc0MGYzNjllM2RjZWNmMzE3OGVjMTJiMzk4NWJiZDRhOGU2ZjgxNGI0MjJhYjc2NjU3MyxwPXlxbTcyWWxmc2hFTmpQUjFYeGFucG5IUVA4bz0=
    </response>
  • 如果一切顺利,您将收到 <success>来自服务器的响应:

     <success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>
    dj1wTk5ERlZFUXh1WHhDb1NFaVc4R0VaKzFSU289
    </success>
  • Base64 解码后包含:
     v=pNNDFVEQxuXxCoSEiW8GEZ+1RSo=
  • 客户端必须确保 v 的值是 serverSignature 的 base64 编码.

  • 附加功能

    这是算法的基本版本。您可以扩展它以执行以下操作:
  • channel 绑定(bind)。这将来自 TLS 连接的一些信息混合到程序中,以防止中间人攻击。
  • 散列存储。如果服务器总是发送相同的 salti值,那么客户端只能存储 saltedPassword而不是用户的密码。这更安全(因为客户端不需要存储密码,只是一个难以反转的加盐哈希)并且更快,因为客户端不需要每次都进行所有的 key 拉伸(stretch)。

    服务器也可以使用散列存储:服务器只能存储salt , i , storedKeyserverKey .更多信息 here .
  • 可能还会添加 SCRAM-SHA-256(尽管服务器支持似乎不存在)。

  • 陷阱

    一些常见的陷阱:
  • 不要对随机数的长度或 salt 做任何假设(尽管如果您生成它们,请确保它们足够长且加密随机)。
  • salt是 base64 编码的,可以包含任何数据(嵌入 NUL s)。
  • 不使用 SASLprep 可能对使用 ASCII 密码的人工作正常,但它可能会完全破坏使用其他脚本的人的登录。
  • initialMessage authMessage的一部分不包括 GS2 header (在大多数情况下,这是 "n,," )。

  • 测试向量

    如果您想测试您的实现,以下是 RFC 示例的所有中间结果:
  • 用户名:user
  • 密码:pencil
  • 客户端生成随机数 fyko+d2lbbFgONRv9qkxdawL
  • 初始消息:n,,n=user,r=fyko+d2lbbFgONRv9qkxdawL
  • 服务器生成随机数 3rfcNHYJY1ZVvWVs7j
  • 服务器回复:r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,s=QSXCR+Q6sek8bf92,i=4096
  • 盐(十六进制):4125c247e43ab1e93c6dff76
  • 客户端最终消息裸露:c=biws,r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j
  • 加盐密码(十六进制):1d96ee3a529b5a5f9e47c01f229a2cb8a6e15f7d
  • 客户端 key (十六进制):e234c47bf6c36696dd6d852b99aaa2ba26555728
  • 存储的 key (十六进制):e9d94660c39d65c38fbad91c358f14da0eef2bd6
  • 认证信息:n=user,r=fyko+d2lbbFgONRv9qkxdawL,r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,s=QSXCR+Q6sek8bf92,i=4096,c=biws,r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j
  • 客户端签名(十六进制):5d7138c486b0bfabdf49e3e2da8bd6e5c79db613
  • 客户证明(十六进制):bf45fcbf7073d93d022466c94321745fe1c8e13b
  • 服务器 key (十六进制):0fe09258b3ac852ba502cc62ba903eaacdbf7d31
  • 服务器签名(十六进制):ae617da6a57c4bbb2e0286568dae1d251905b0a4
  • 客户最终留言:c=biws,r=fyko+d2lbbFgONRv9qkxdawL3rfcNHYJY1ZVvWVs7j,p=v0X8v3Bz2T0CJGbJQyF0X+HI4Ts=
  • 服务器最终消息:v=rmF9pqV8S7suAoZWja4dJRkFsKQ=
  • 服务器的服务器签名(十六进制):ae617da6a57c4bbb2e0286568dae1d251905b0a4
  • 关于authentication - XMPP SASL SCRAM-SHA1 认证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29298346/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com