Java вычисляет шестнадцатеричное представление SHA-1 дайджеста строки - PullRequest
57 голосов
/ 09 декабря 2010

Я храню пароль пользователя на БД в виде хэша sha1.

К сожалению, я получаю странные ответы.

Я храню строку как это:

MessageDigest cript = MessageDigest.getInstance("SHA-1");
              cript.reset();
              cript.update(userPass.getBytes("utf8"));
              this.password = new String(cript.digest());

Я хотел что-то вроде этого ->

aff -> "0c05aa56405c447e6678b7f3127febde5c3a9238"

, а не

aff -> @V @ \ D ~ fx : 8

Ответы [ 15 ]

1 голос
/ 21 июля 2014

Вы также можете использовать этот код (с crackstation.net):

private static String toHex(byte[] array) { BigInteger bi = new BigInteger(1, array); String hex = bi.toString(16); int paddingLength = (array.length * 2) - hex.length(); if(paddingLength > 0) return String.format("%0" + paddingLength + "d", 0) + hex; else return hex; }

1 голос
/ 29 марта 2013

Как насчет преобразования байта [] в строку base64?

    byte[] chkSumBytArr = digest.digest();
    BASE64Encoder encoder = new BASE64Encoder();
    String base64CheckSum = encoder.encode(chkSumBytArr);
1 голос
/ 09 декабря 2010

digest () возвращает байтовый массив, который вы конвертируете в строку, используя кодировку по умолчанию. То, что вы хотите сделать, это base64 кодировать его.

1 голос
/ 09 декабря 2010

Чтобы использовать UTF-8, сделайте следующее:

userPass.getBytes("UTF-8");

И чтобы получить строку Base64 из дайджеста, вы можете сделать что-то вроде этого:

this.password = new BASE64Encoder().encode(cript.digest());

Поскольку MessageDigest.digest() возвращает байтовый массив, его можно преобразовать в строку, используя шестнадцатеричное кодирование Apache (проще).

* 1016 Е.Г. *

this.password = Hex.encodeHexString(cript.digest());
0 голосов
/ 09 декабря 2010

Вам нужно сначала закодировать результат в шестнадцатеричном формате.MessageDigest возвращает «сырой» хэш, а не читаемый человеком.

Edit:

@ thejh предоставил ссылку на код, который должен работатьЛично я бы предложил использовать для этого либо Bouncycastle , либо Apache Commons Codec .Bouncycastle был бы хорош, если вы хотите выполнять какие-либо другие операции, связанные с шифрованием.

...