编程语言
首页 > 编程语言> > java-装饰HashMap添加随机性以防止(D)DoS

java-装饰HashMap添加随机性以防止(D)DoS

作者:互联网

顺便说一下,这里的解决方法是重新使用所有现有的HashMap(例如ConcurrentHashMap等),而不是完全重新发明轮子.使用随机哈希函数的语言(如Perl)可以防止这种攻击.

鉴于最近在多个hashmap实现中使用已知缺陷的DDoS(具有破坏性)(已知会影响Java Web服务器,但也影响PHP和其他),Apache Tomcat刚刚以补丁的形式发布了一个“修复程序”,允许放置限制POST请求中允许的最大参数数量(将Tomcat修补为6.0.35或7.0.23 btw).

(D)DoS显然基本上是基于这样的事实,即可以对字符串进行精心设计,使它们在散列时发生冲突,并且许多Web服务器“愚蠢地”将键/值参数放入(断开)散列图中.

我想知道是否有可能在HashMap {String,String}周围编写装饰器,以便向每个String添加一个随机值(从受攻击的角度来看是随机的),就像这样:

... get( String s ) {
    return wrappedBrokenMap.get( s + crunch(s );
}

... put( String key, String value ) {


  wrappedBrokenMap.put( s + crunch(s), value );
}

这将是crunch(…)的一个实现(这只是一个示例,重点是:攻击者不知道实现):

private static final int MY_MAGICAL_NUMBER = 0x42BABE;  // attacker doesn't know that number

private static String crunch( String s ) {
    return s.length + "" + MY_MAGICAL_NUMBER;
}

如果对于任何String,紧急情况都返回了攻击者无法猜测的可复制String,那么DDoS攻击已被有效阻止了吗?

那行得通吗?

解决方法:

If for any String s crunch(s) returns a reproducible String that the attacker cannot guess, the DDoS attack has effectively been prevented right?

基本上,这是在对密码哈希加盐时执行的操作(尽管出于稍微不同的原因).它不能完全防止碰撞攻击(如果您具有将任意长度的输入映射到固定长度的输出的哈希函数,则哈希值始终会发生冲突),但是使用秘密盐会使此类攻击更加困难.

一个快速的’肮脏的实现可能看起来像这样:

public class SaltedHashMap<V> {
    private final Map<String, V> map = new HashMap<>();
    private final String salt;
    public SaltedHashMap(String salt) {
        this.salt = salt;
    }
    public V get(String key){
        return map.get(key + salt);
    }
    public void put(String key, V value) {
        map.put(key + salt, value);
    }
}

以Web服务器为例,我们可以使用SecureRandom为每个传入请求随机分配一个新的盐,这意味着即使您设法为一个请求找出了产生冲突的输入,对于其他请求也不大可能起作用要求.

标签:hashmap,denial-of-service,java,php
来源: https://codeday.me/bug/20191101/1986887.html