类型: 安全缺陷

    程序加密时所采用的salt被用户控制,当攻击者可以指定一个空salt时,既能更容易地确定散列值,又能泄露有关程序如何执行加密散列的信息,通过限制所用散列的特定变体,可以更轻松地“破解”其他密码。

    1. Properties prop = new Properties();
    2. prop.load(new FileInputStream("local.properties"));
    3. String salt = prop.getProperty("salt");
    4. ...
    5. PBEKeySpec pbeSpec=new PBEKeySpec(password);
    6. SecretKeyFactory keyFact=SecretKeyFactory.getInstance(CIPHER_ALG);
    7. PBEParameterSpec defParams=new PBEParameterSpec(salt,0);
    8. Cipher cipher=Cipher.getInstance(CIPHER_ALG);
    9. cipher.init(cipherMode,keyFact.generateSecret(pbeSpec),defParams);

    该代码可以正常运行,任何有此功能权限的人将能够通过修改属性salt,来操纵用于派生密钥或密码的salt。在程序发布之后,撤消有关用户控制的salt的问题会非常困难,因为很难知道密码散列的salt是否已经被恶意用户确定。