如何:启用消息重播检测

当攻击者复制双方之间的消息流并将该消息流向一方或多方重播时,将发生重播攻击。除非攻击程度降低,否则受到攻击的计算机会将该流处理为合法消息,从而导致产生大量不良结果,例如某项的冗余排序。

有关消息重播检测的更多信息,请参见消息重播检测(可能为英文网页)。

下面的过程演示在用 Windows Communication Foundation (WCF) 控制重播检测时所使用的各种属性。

使用代码在客户端上控制重播检测

  1. 创建要在 CustomBinding 中使用的 SecurityBindingElement。有关更多信息,请参见 如何:使用 SecurityBindingElement 创建自定义绑定.下面的示例使用通过 SecurityBindingElement 类的 CreateKerberosBindingElement 创建的 SymmetricSecurityBindingElement

  2. 使用 LocalClientSettings 属性返回对 LocalClientSecuritySettings 类的引用,并根据需要设置任何下列属性:

    1. DetectReplay.一个布尔值。该值控制客户端是否应当检测来自服务器的重播。默认值为 true

    2. MaxClockSkew.TimeSpan 值。控制重播机制在客户端和服务器之间可以容忍多大程度的时间偏差。该安全机制检查发送的时间戳,并确定在过去它是否返回过快。默认值为 5 分钟。

    3. ReplayWindow.TimeSpan 值。该值控制某消息在由服务器(通过中间方)发送之后、到达客户端之前在网络中存留的时间。客户端跟踪在最后一个 ReplayWindow 中发送的消息的签名,以进行重播检测。

    4. ReplayCacheSize.一个整数值。客户端在缓存中存储消息的签名。此设置指定缓存中可以存储的签名数目。如果最后一个重播窗口中发送的消息数达到缓存限制,则拒绝新消息,直到最旧的缓存签名达到时间限制为止。默认值为 500000。

使用代码在服务上控制重播检测

  1. 创建要在 CustomBinding 中使用的 SecurityBindingElement

  2. 使用 LocalServiceSettings 属性返回对 LocalServiceSecuritySettings 类的引用,并按照上面所述设置这些属性。

在客户端或服务的配置中控制重播检测

  1. 创建 customBinding Element

  2. 创建 <security> 元素。

  3. 创建 localClientSettings elementlocalServiceSettings element

  4. 根据需要,设置下列属性值:detectReplaysmaxClockSkewreplayWindowreplayCacheSize。下面的示例设置 <localServiceSettings><localClientSettings> 和 元素的属性:

    <customBinding>
      <binding name="NewBinding0">
       <textMessageEncoding />
        <security>
         <localClientSettings 
          replayCacheSize="800000" 
          maxClockSkew="00:03:00"
          replayWindow="00:03:00" />
         <localServiceSettings 
          replayCacheSize="800000" 
          maxClockSkew="00:03:00"
          replayWindow="00:03:00" />
        <secureConversationBootstrap />
       </security>
      <httpTransport />
     </binding>
    </customBinding>
    

示例

下面的示例使用 CreateKerberosBindingElement 方法创建 SymmetricSecurityBindingElement,并设置绑定的重播属性。

Private Function CreateSymetricBindingForClient() As SecurityBindingElement
    Dim b = SecurityBindingElement.CreateKerberosBindingElement()
    With b.LocalClientSettings
        .DetectReplays = True
        .MaxClockSkew = New TimeSpan(0, 3, 0)
        .ReplayWindow = New TimeSpan(0, 2, 0)
        .ReplayCacheSize = 10000
    End With
    Return b
End Function
private SecurityBindingElement CreateSymetricBindingForClient()
{
    SymmetricSecurityBindingElement b = SecurityBindingElement.CreateKerberosBindingElement();
    b.LocalClientSettings.DetectReplays = true;
    b.LocalClientSettings.MaxClockSkew = new TimeSpan(0, 3, 0);
    b.LocalClientSettings.ReplayWindow = new TimeSpan(0, 2, 0);
    b.LocalClientSettings.ReplayCacheSize = 10000;
    return b;
}

重播范围:仅限消息安全

请注意,下面的过程仅适用于“消息安全”模式。对于“传输”和“使用消息凭据传输”模式,传输机制将检测重播。

安全对话说明

对于启用安全对话的绑定,可以针对应用程序通道和安全对话引导绑定来调整这些设置。例如,可以对应用程序通道关闭重播,但是对建立安全对话的引导通道启用重播。

如果不使用安全对话会话,则重播检测不保证在服务器场方案中和回收进程时检测重播。这适用于系统提供的下列绑定:

编译代码

另请参见

参考

LocalClientSecuritySettings
LocalServiceSecuritySettings

概念

安全对话和安全会话
如何:使用 SecurityBindingElement 创建自定义绑定

其他资源

localClientSettings element