2012-01-05 89 views
-1

我在春季安全中编写了一个哈希码隐藏方法。在这种方法中,我将在数据库中保存salt值和迭代大小。当用户使用纯密码登录时,下次我将使用盐值和从数据库迭代并消化密码。但是,即使盐和迭代值相同,此方法也会生成不同的哈希码。为什么Digester为同样的消息,代码和迭代生成不同的哈希码

public Administrator encryptDigestCode(Administrator administrator) { 
    StandardStringDigester digester = new StandardStringDigester(); 
    Administrator admin = new Administrator(); 
    digester.setAlgorithm("SHA-256"); 
    digester.setStringOutputType("base64"); 
    Random ran = new Random(); 
    int iterate = ran.nextInt(1000); 
    digester.setIterations(iterate); 
    RandomSaltGenerator ram = new RandomSaltGenerator(); 
    byte[] salt = ram.generateSalt(10); 
    String pass = new String(salt) + administrator.getHashedPassword(); 
    String encryptedPassword = digester.digest(pass); 
    if (digester.matches(administrator.getHashedPassword(), 
      encryptedPassword)) { 
     admin.setLoginDetail(new LoginDetail()); 
     admin.getLoginDetail().setSalt(new String(ram.generateSalt(10))); 
     admin.getLoginDetail().setHashingCycle(iterate); 
     admin.setUserName(administrator.getUsername()); 
     admin.setSesamiagreementno(administrator.getSesamiagreementno()); 
     admin.setHashedPassword(encryptedPassword); 
    } else { 
     admin.setLoginDetail(null); 
     admin.setHashedPassword(null); 
     admin.setUserName(null); 
    } 
    return admin; 
} 

我应该怎么做?任何代码或网站以供参考。谢谢

+0

您将不得不张贴真实的代码,而不是每次调用时都会生成一个新的随机盐的代码。 – 2012-01-05 23:31:26

+0

OK,-1不指定盐的存储方式。 – 2012-01-09 20:53:29

回答

0

看起来像你使用随机盐。当然,哈希总是不同的。


而且还有一个第二随机值

Random ran = new Random(); 
int iterate = ran.nextInt(1000); 
digester.setIterations(iterate); 

我希望,这也进水的结果。所以,如果你没有运气,那么得到相同的随机值两次,哈希是不同的。

+0

hi ralph,是的,我使用随机salt.but这个值将被保存在数据库中,当用户下次登录时。我将在数据库中获得盐值并添加明文密码用户输入然后进行摘要。但我保存在数据库中的散列码与我第二次生成时的散列码不同 – sudo 2012-01-05 09:03:13

+0

@sudo:还有一个随机值 - 请参阅我的扩展答案。顺便说一句我有这样的感觉,有一些错误:盐需要被添加到密码之前哈希被计算 - 但我可能不理解代码正确 – Ralph 2012-01-05 11:02:10

0

线

admin.getLoginDetail().setSalt(new String(ram.generateSalt(10)));

是错误的。首先,它会生成一个新的随机盐,并将其放入数据库而不是使用变量salt。即您可以调用generateSalt两次:第一个结果用于散列密码,第二个结果存储在数据库中。其次,它将一个随机的字节数组转换为一个字符串。 除非您确定这些字节与可打印字符相对应,否则您应该在这里使用base64编码(当然,必要时也可以进行适当的解码)。

同样使用随机整数进行迭代次数并不是一个好主意。迭代次数应该对一个计算成本昂贵的单个目标进行强力攻击。如果你在这里使用一个随机数,那么攻击者可能会试图找到迭代计数最低的用户并开始攻击这个密码。

相关问题