Java SHA-1 хэш неподписанного байта
Привет, ребята!
У меня есть следующая проблема: мне нужно хэшировать неподписанный байт в Java, который (будет...) между 0-255. Основная проблема заключается в том, что в java вообще нет типа unsigned Byte. Я нашел обходной путь для этого и использовал int вместо байта с небольшой модификацией.
Основная проблема заключается в следующем: функция Java.securitys Messagedigest.digest принимает только типы байтовых массивов, но мне нужно предоставить ей массив int.
У кого-нибудь есть обходной путь для этого? Я искал стороннюю функцию ша-1, но ничего не нашел. Ни какой пример кода.
Итак, в основном то, что мне нужно: у меня есть значение байта без знака, например: 0xFF, и мне нужно получить следующий хэш sha1: 85e53271e14006f0265921d02d4d736cdc580b0b
любая помощь будет принята с благодарностью.
3 ответа
Важно понимать, что нет разницы между подписанными и неподписанными байтами в отношении их представления. Подпись - это то, как байты обрабатываются арифметическими операциями (кроме сложения и вычитания, в случае представления дополнения 2).
Итак, если вы используете byte
Для хранения данных все, что вам нужно, это убедиться, что вы обращаетесь с ними как без знака при преобразовании значений в byte
s (используйте явное приведение с (byte)
, пункт 1) и из byte
s (предотвратить расширение знака с помощью & 0xff
, пункт 2):
public static void main(String[] args) throws Exception {
byte[] in = { (byte) 0xff }; // (1)
byte[] hash = MessageDigest.getInstance("SHA-1").digest(in);
System.out.println(toHexString(hash));
}
private static String toHexString(byte[] in) {
StringBuilder out = new StringBuilder(in.length * 2);
for (byte b: in)
out.append(String.format("%02X", b & 0xff)); // (2)
return out.toString();
}
Дайджест не будет заботиться о том, как Java воспринимает знак байта; это заботится только о битовой структуре байта. Попробуй это:
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.update((byte) 0xFF);
byte[] result = digest.digest();
StringBuilder buffer = new StringBuilder();
for (byte each : result)
buffer.append(String.format("%02x", 0xFF & each));
System.out.println(buffer.toString());
Это должно напечатать 85e53271e14006f0265921d02d4d736cdc580b0b
,
Посмотрите на библиотеку кодеков Apache Commons, метод DigestUtils.sha (String data). Это может быть полезно для вас.