wcf - 关于使用 WCF 进行 HMAC 身份验证的说明

标签 wcf authentication rest hmac

我一直在关注几篇有关使用 WCF 的 RESTful Web 服务的文章,更具体地说,是如何在这些文章中进行身份验证。我引用的主要文章是 Aaron Skonnard 的 RESTful Web Services with WCF 3.5 。另一种专门处理 HMAC 身份验证的方法是 Itai Goldstiens article这是基于斯科纳德的文章。

我对两篇文章中提到的“用户 key ”感到困惑。我有一个客户端应用程序,需要用户同时拥有用户名和密码。

  • 这是否意味着我用来初始化的 key System.Security.Cryptography.HMACMD5 类只是用户 密码?
  • 给出 Itai 文章中用于创建 Mac 的方法 (如下所示),我认为关键是用户,对吗? 密码和 text 是我们使用的字符串,以确认 详细信息实际上是正确的吗?

    public static string EncodeText(byte[] key, string text, Encoding encoding)
    {
        HMACMD5 hmacMD5 = new HMACMD5(key);
        byte[] textBytes = encoding.GetBytes(text);
        byte[] encodedTextBytes =
            hmacMD5.ComputeHash(textBytes);
        string encodedText =
            Convert.ToBase64String(encodedTextBytes);
        return encodedText;
    }
    

在我的示例中,text 参数将是请求 uri、共享 key 和时间戳的组合(它将作为请求 header 提供并用于防止重放攻击)。

这种身份验证形式合适吗?我遇到过another thread这表明上面文章中定义的方法是“..a(原文如此)丑陋的黑客”。作者没有说明原因,但考虑到我花了几个小时阅读并使其发挥作用,这令人沮丧。然而,值得注意的是,这个问题的公认答案讨论了自定义 HMAC 授权方案,因此丑陋的黑客引用可能只是它的实现,而不是 HMAC 算法本身的使用。

下图来自the wikipedia article on Message Authentication Code 。我觉得这应该是一种安全的方法,但我只是想确保我理解它的正确使用,并确保这不仅仅是一些过时的机制,已经被更好的东西超越了。

Illustrates how MAC authentication works between sender and reciever

最佳答案

key 可以是用户的密码,但是您绝对不应该这样做

  • 首先 - key 的最佳长度等于输出哈希的大小,而用户的密码很少会等于该长度。
  • 其次,这些字节中永远不会有足够的随机性(用技术术语来说是熵)来成为足够的 key 。
  • 第三,虽然您正在防止重放攻击,但您允许任何人潜在地签署任何类型的请求,假设他们也可以掌握共享 secret (是服务器在某个时刻广播的还是派生的)仅在客户端和服务器上?如果广播,中间人攻击可以轻松获取并存储该信息 - 高度偏执,是的,但我认为您应该考虑一下)除非用户更改密码。<
  • 第四 - 停止使用 HMACMD5 - 至少使用 HMAC-SHA-256。

此 key 至少应该是从用户密码生成的一系列字节 - 通常使用类似 PBKDF2 的内容。 - 但是,您还应该包含一些基于 session 的临时内容,并且在理想情况下,攻击者无法知道这些内容。

也就是说,很多人可能会告诉你我太偏执了。

就我个人而言,我知道我不是身份验证方面的专家 - 这是一个非常微妙的平衡行为 - 因此我依赖经过同行评审和经过验证的技术。例如,SSL(在这种情况下通过客户端证书进行身份验证)可能有其弱点,但大多数人都使用它,如果我的系统之一由于 SSL 弱点而被利用,那不会是我的错。但是,如果由于我不够聪明而无法识别的某些弱点而发生漏洞呢?我会把自己从前门踢出去。

顺便说一句,对于我的休息服务,我现在使用 SCRAM对于身份验证,使用 SHA512 和 512 位随机盐进行拉伸(stretch)操作(很多人会说这太过分了,但我暂时不需要更改它!),然后使用安全 token (使用 HMAC 和使用 AES 加密)从身份验证和其他仅服务器已知的信息派生,以保留经过身份验证的 session 。该 token 是无状态的,与 Asp.Net 表单例份验证 cookie 的方式相同。

密码交换确实工作得很好,即使没有 SSL(保护密码)也是安全的,并且具有验证客户端和服务器的附加优势。 session 持久性可以根据站点和客户端进行调整 - token 在其中携带自己的到期值和绝对到期值,并且可以轻松调整这些值。通过将客户端 ID 信息也加密到该 token 中,只需比较客户端提供的值中的解密值,就可以防止复制到另一台计算机上。唯一需要注意的是 IP 地址信息,是的,它可能会被欺骗,但首先,您必须考虑漫游网络上的合法用户。

关于wcf - 关于使用 WCF 进行 HMAC 身份验证的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9922085/

相关文章:

c# - IIS 7.5、Web 服务和 HTTP 405 错误

google-chrome - 如何使用 FIDO U2F 允许用户通过我的网站进行身份验证?

azure - 我如何知道对我的机器人的请求源自 Teams?

Codeigniter ion auth 密码问题

java - REST 服务仅返回当前用户相关的资源

c# - 通过 WCF 服务使用连接字符串建立与 Azure SQL 数据库的连接时出现问题

c# - 为什么 WCF 有时会在生成的代理类型末尾添加 "Field"?

c# - WCF 故障处理

java - 使用 spring RestTemplate 消耗 json+hal _embedded 资源的问题

rest - 如何使用证书 golang 发送 https 请求