📜  重播攻击(1)

📅  最后修改于: 2023-12-03 14:58:11.596000             🧑  作者: Mango

重播攻击

重播攻击(Replay Attack)是一种网络安全攻击,攻击者会在网络中窃取或者记录传输过程中的数据包,然后将这些数据包再次发送到网络中,企图达到模拟合法用户获取数据,绕过网站验证机制等目的。

重播攻击的原理

重播攻击的原理非常简单,攻击者通过监听、窃取、截获合法用户与Web服务器之间的通信数据包,保存下来并改写部分数据,然后再次将数据包发送给Web服务器,使Web服务器认为这是一次合法的请求而返回相应的响应结果。

重播攻击的危害

重播攻击能够绕过Web安全认证机制,使得攻击者能够在不授权的情况下访问被攻击系统的资源。尤其是在电子支付、证券交易等敏感场合,如果有攻击者发起重播攻击,就会对经济和社会造成巨大的影响和严重的财务损失。

重播攻击的防护
  • 序列号或时间戳验证:序列号或时间戳验证是防止重播攻击的一种有效的方法。在每个请求中添加唯一的序列号或时间戳,服务器端对每个请求和响应都检查序列号或时间戳是否已被使用。如果请求是一次合法请求,该请求的序列号或时间戳就会被标记为已被使用,服务器对相同的序列号或时间戳的请求直接拒绝响应。

  • HMAC消息认证:HMAC(Hash-based Message Authentication Code)是一种验证消息完整性的方法。在发送请求的同时,将请求数据与一个特定密钥一起计算出消息摘要(Message Digest),在发送的数据包中添加消息摘要,Web服务器在接收到请求数据时再通过同样的密钥计算消息摘要进行比较,判断数据包是否经历篡改。如果摘要验证失败,服务器将拒绝响应请求。

  • 防重放Token:防重放Token是一种服务器生成的特殊令牌,每次请求时都要求客户端提供该Token。服务器对Token进行验证,如果Token失效或被使用过,服务器会拒绝响应请求,即使请求数据是合法的。

// Java实现防重放攻击 Token示例
public class AntiReplayToken {
    private static final ConcurrentHashMap<String, Long> TOKEN_MAP = new ConcurrentHashMap<>();
    private static final long MAX_TIME_STAMP = 5 * 60 * 1000L; // Token 超时时间,5min
    private static final String SECRET = "abcdefg"; // 验证密钥

    // 生成 Token 格式为:md5(timeStamp + SECRET)
    public static String generateToken() {
        long timeStamp = System.currentTimeMillis();
        String token = md5(timeStamp + SECRET);
        TOKEN_MAP.put(token, timeStamp);
        return token;
    }

    // 校验 Token 是否过期或已被使用
    public static boolean validateToken(String token) {
        if (TOKEN_MAP.containsKey(token)) {
            long timeStamp = TOKEN_MAP.get(token);
            if (System.currentTimeMillis() - timeStamp < MAX_TIME_STAMP) {
                TOKEN_MAP.remove(token);
                return true;
            }
        }
        return false;
    }

    // md5 加密
    private static String md5(String val) {
        String result = "";
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] bytes = md.digest(val.getBytes("utf-8"));
            result = bytesToHex(bytes);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

    // 转换成16进制
    private static String bytesToHex(byte[] bytes) {
        StringBuilder hexStr = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            String hex = Integer.toHexString(bytes[i] & 0xFF);
            if (hex.length() == 1) {
                hexStr.append("0");
            }
            hexStr.append(hex);
        }
        return hexStr.toString();
    }
}
结论

重播攻击是一种常见的网络安全攻击,攻击者通过监听、窃取或截获合法用户和服务器之间的通信数据包,再次发送篡改过的数据包达到模拟合法用户的目的。为了防止重播攻击,可以通过添加序列号、时间戳、HMAC消息认证和防重放Token等方法进行防护。