如何:启用消息重放检测

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

有关消息重放检测的详细信息,请参阅消息重放检测

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

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

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

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

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

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

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

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

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

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

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

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

  1. 创建 <customBinding>

  2. 创建 <security> 元素。

  3. 创建 <localClientSettings><localServiceSettings>

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

    <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>  
    

示例

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

private SecurityBindingElement CreateSymmetricBindingForClient()
{
    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;
}
Private Function CreateSymmetricBindingForClient() 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

重播范围:仅限消息安全

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

安全对话说明

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

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

编译代码

另请参阅