类型: 安全缺陷
程序加密时所采用的salt被用户控制,当攻击者可以指定一个空salt时,既能更容易地确定散列值,又能泄露有关程序如何执行加密散列的信息,通过限制所用散列的特定变体,可以更轻松地“破解”其他密码。
Properties prop = new Properties();
prop.load(new FileInputStream("local.properties"));
String salt = prop.getProperty("salt");
...
PBEKeySpec pbeSpec=new PBEKeySpec(password);
SecretKeyFactory keyFact=SecretKeyFactory.getInstance(CIPHER_ALG);
PBEParameterSpec defParams=new PBEParameterSpec(salt,0);
Cipher cipher=Cipher.getInstance(CIPHER_ALG);
cipher.init(cipherMode,keyFact.generateSecret(pbeSpec),defParams);
该代码可以正常运行,任何有此功能权限的人将能够通过修改属性salt,来操纵用于派生密钥或密码的salt。在程序发布之后,撤消有关用户控制的salt的问题会非常困难,因为很难知道密码散列的salt是否已经被恶意用户确定。