【问题标题】:Securing REST API with hashed signature使用散列签名保护 REST API
【发布时间】:2012-11-15 18:11:14
【问题描述】:

我在这里问了一个与此相关的问题:

Securely Passing UserID from ASP.Net to Javascript

但是现在我有一个更详细/具体的问题。我有服务,并且我有将使用服务的应用程序,我的计划是保护它,是根据一些值、随机数和密钥生成散列。我唯一的问题是,似乎为了验证哈希,我必须发送所有值加上随机数,除了密钥。这是我的设计中的一个缺陷,还是这样的事情是如何完成的?我在 Google 上四处搜索,但无法确定这是否是正确的安全方式。

例如,假设我需要将值 1,2 和 3 传递给我的休息服务,所以我使用电话号码、随机数和密钥来生成哈希,现在为了再次生成哈希除了密钥(我可以根据用户的电话号码检索)之外,我需要传递上述所有内容。

我完全让我的服务受到攻击,妥善保护它,还是介于两者之间?

编辑:进行了拼写和语法更正

编辑 2:最终通过使用带有表单身份验证的 MVC 4、两个项目之间相同的 cookie 名称以及使用全局应用的 [Authorize] 属性来获得令人满意的解决方案

【问题讨论】:

    标签: web-services security hash


    【解决方案1】:

    这个计划本身并没有错。如果客户端发送:

    data . nonce . hash(data . nonce . shared-secret)
    

    然后服务器通过检查hash(data . nonce . shared-secret) 是否与客户端提供的哈希匹配来验证消息,您可以安全地防止篡改和重放(当然,假设您使用的是合理的加密哈希算法)。

    在这种设计下,客户端甚至可以生成自己的随机数,前提是不存在两个客户端生成相同随机数的风险。

    但是,窃听者仍然能够看到您发送的所有数据......所以,除非有很好的理由不这样做,否则我会简单地使用 https(除非有其他我不知道的要求,否则完全足够)。

    【讨论】:

    • 好吧,有道理,那么数据是否可以包含用户标识符并且仍然是安全的?我正在使用 HMAC256 算法 fyi。
    • 您必须定义“安全”。在这种方案下,服务器将能够检测到篡改和重放攻击,但它不是是秘密的(显然)。
    • 公平地说,在这个范围内,我们试图防止重放和中间人攻击,当用户到达应用程序的区域时,他们应该有这个休息调用事先验证了他们的凭据
    • 如果用户已经被认证过了,这有什么用呢?假设这将通过网络浏览器完成,如果身份验证是通过不安全的通道执行的,中间人可能会简单地窃取用户的凭据。
    • 我们还试图阻止用户“冒充”另一个用户并以这种方式取回数据。我知道如果攻击者获得了用户凭据,所有的赌注都没有了,但目标是防止重放攻击,并防止外部人员只是进行 REST 调用并取回数据
    猜你喜欢
    • 2014-12-28
    • 1970-01-01
    • 2016-08-17
    • 1970-01-01
    • 2019-06-03
    • 2017-04-15
    • 2014-02-21
    • 2020-04-18
    相关资源
    最近更新 更多