在SHA512Digest的doFinal中组合两个字节[]



在此方法中,只有一个指令不起作用:

private static byte[] encodePassword(String password,String salt) throws UnsupportedEncodingException 
{      
String mergedPasswordAndSalt =mergePasswordAndSalt(password, salt);
SHA512Digest digester =new  SHA512Digest();   
byte[] hash = new byte[digester.getDigestSize()];   
digester.update(hash, 0, mergedPasswordAndSalt.length());
digester.doFinal(hash, 0);
System.out.println("init hash= "+Base64.encode(hash));          
for (int  i = 1; i < ITERATIONS; ++i) {
digester.update(hash, 0, mergedPasswordAndSalt.length());  
digester.doFinal(Bytes.concat(hash, mergedPasswordAndSalt.getBytes("UTF-8")),0); 
}     
System.out.println("FINAL hash= "+Base64.encode(hash));
return hash;
}

该指令:相当于Java API中的这个指令,即:

for (int i = 1; i < ITERATIONS; ++i) {
hash = digester.digest(Bytes.concat(hash, mergedPasswordAndSalt.getBytes("UTF-8")));
}

我有解决方案: 为了连接字节,我使用了这种方法:

public static byte[] concat(byte[]... arrays) {
int length = 0;
byte[][] arr$ = arrays;
int pos = arrays.length;
for(int i$ = 0; i$ < pos; ++i$) {
byte[] array = arr$[i$];
length += array.length;
}
byte[] result = new byte[length];
pos = 0;
byte[][] arr$$=arrays; 
arr$=arr$$;
int len$ = arrays.length;
for(int i$ = 0; i$ < len$; ++i$) {
byte[] array = arr$[i$];
System.arraycopy(array, 0, result, pos, array.length);
pos += array.length;
}
return result;
}

要对摘要进行 4999 迭代,我们需要一种方法,该方法在每次迭代后获取哈希值,并在与第一个 diegest(生成循环外(连接的当前摘要中工作:

private static byte[] encodePassword(String password,String salt) throws UnsupportedEncodingException 
{                       
String mergedPasswordAndSalt =mergePasswordAndSalt(password, salt);

byte[] hash = new byte[88];   
hash=digestt(mergedPasswordAndSalt.getBytes("UTF-8"));                                
for (int  i = 1; i < ITERATIONS; ++i) {                                                          
hash=digestt(concat(hash,mergedPasswordAndSalt.getBytes("UTF-8")));
}     
return hash;
}
public static byte[] digestt(byte[] bytes) {
Digest digest = new SHA512Digest();
byte[] resBuf = new byte[digest.getDigestSize()];
digest.update(bytes, 0, bytes.length);
digest.doFinal(resBuf, 0);
return resBuf;
}

非常感谢你,我问了很多问题,你总是在那里寻求帮助。

最新更新