объединить два байта [] в doFinal SHA512Digest - PullRequest
0 голосов
/ 04 мая 2018

в этом методе есть только одна неработающая инструкция:

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")));
    }

1 Ответ

0 голосов
/ 04 мая 2018

У меня есть решение: Для объединения байтов я использовал этот метод:

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 для дайджеста, нам нужен метод, который принимает хеш после каждой итерации и работает в текущем дайджесте, объединенном с первым дайджестом (генерировать из цикла):

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;
}

Большое спасибо, я задавал много вопросов, и вы всегда готовы помочь.

...