2

我想允许对用户提出安全问题。我正在使用 Spring3,但不确定是否存在执行此操作的标准方法。任何人都可以指出它存在的这种标准吗?

4

1 回答 1

0

我不熟悉涵盖此内容的标准,但我建议您像对待密码一样对待安全问题......

  • 确保您打开 autocomplete="off" 以便浏览器不会记住他们的答案

  • 为答案生成一个加盐散列(或者您可以重复使用该散列作为他们的密码)

    public byte[] generateSalt() throws NoSuchAlgorithmException {
        // VERY important to use SecureRandom instead of just Random
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
    
        // Generate a 8 byte (64 bit) salt as recommended by RSA PKCS5
        byte[] salt = new byte[8];
        secureRandom.nextBytes(salt);
    
        return salt;
    }
    
  • 加密答案

    public static byte[] getEncryptedAnswer(String answer, byte[] salt) throws NoSuchAlgorithmException, InvalidKeySpecException {
        KeySpec spec = new PBEKeySpec(answer.toCharArray(), salt, 20000, 160);
    
        SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");
    
        return secretKeyFactory.generateSecret(spec).getEncoded();
    }
    

存储加盐哈希和加密答案。此时,您几乎可以像使用密码一样使用此问题的答案。


综上所述,我必须同意 jHilscher 的观点……这些安全问题中有太多是可以预测或容易猜到的。最喜欢的颜色、毕业年份等等……我从来没有用正确的信息回答这些问题。我建议您在需要时找到其他方法来重置密码。

于 2013-12-11T17:54:09.347 回答