SHA1 возвращает другой дайджест - PullRequest
0 голосов
/ 29 августа 2011
    import java.security.MessageDigest;
    class Enc{

            public String encryptPassword(String password) throws Exception{
                    byte[] bArray=password.getBytes();
                    MessageDigest md=MessageDigest.getInstance("SHA-1");
                    md.reset();
                    md.update(bArray);
                    byte[] encoded=md.digest();
                    System.out.println(encoded.toString());

                    return "";
            }
            public static void main(String args[]){
                    try{
                    Enc e=new Enc();
                    e.encryptPassword("secret");
                    }catch(Exception e){e.printStackTrace();}
            }
    }

/*

jabira-whosechild-lm.local 12:40:35 % while (true); do java Enc; done 
[B@77df38fd
[B@77df38fd
[B@60072ffb
[B@77df38fd
[B@6016a786
[B@60072ffb
[B@77df38fd
[B@77df38fd
[B@77df38fd
[B@77df38fd
[B@77df38fd
[B@77df38fd
[B@77df38fd
[B@6016a786
[B@6f507fb2
[B@77df38fd
[B@6016a786
[B@77df38fd
[B@77df38fd
[B@6016a786
*/

Ответы [ 2 ]

3 голосов
/ 29 августа 2011

Вы просто распечатываете byte[].toString, что не содержимое хэша.

System.out.println(encoded.toString());

Чтобы отобразить хеш в виде текста, необходимо преобразовать байтовый массив в шестнадцатеричный или base64 - для этого существует множество фрагментов в переполнении стека (например, с использованием кодека Apache Commons ). Если вам не нужен хеш как текст, вы можете просто оставить его как байтовый массив.

Также обратите внимание, что вы не должны использовать этот код:

byte[] bArray=password.getBytes()

При этом будет использоваться системная кодировка символов по умолчанию, которая может варьироваться от системы к системе и может не иметь возможности кодировать весь Unicode. Используйте фиксированную кодировку, такую ​​как UTF-8, которая всегда будет давать одинаковые результаты для одного и того же входа, независимо от настроек системы по умолчанию, и которая может кодировать весь Unicode.

0 голосов
/ 29 августа 2011

Вот фрагмент кода I к MD5 всего файла. Это сработало для меня, когда я MD5ed файл, который я хотел отправить, чтобы увидеть, если у их клиента уже был тот же файл. Полный источник при необходимости можно найти здесь, на Github

private static String getMD5Digest(File file) {
    BufferedInputStream reader = null;
    String hexDigest = new String();
    try {
        reader = new BufferedInputStream( new FileInputStream(file));
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("MD5");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    byte[] buffer = new byte[4096];
    long fileLength = file.length();
    long bytesLeft = fileLength;
    int  read = 0;
    //Read our file into the md buffer
    while(bytesLeft > 0){
        try {
            read = reader.read(buffer,0, bytesLeft < buffer.length ? (int)bytesLeft : buffer.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
        md.update(buffer,0,read);
        bytesLeft -= read;
    }
    byte[] digest = md.digest();
    for (int i = 0; i < digest.length;i++) {
        hexDigest += String.format("%02x" ,0xFF & digest[i]);
    }
    try {
        reader.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return hexDigest;
}
...