Message Digest (hash) to bajt [] w bajcie []
Podsumowanie wiadomości jest zdefiniowane jako funkcja, która pobiera nieprzetworzoną tablicę bajtów i zwraca surową tablicę bajtów (aka byte[]
). Na przykład SHA-1 (Secure Hash Algorithm 1) ma rozmiar skrótu 160 bitów lub 20 bajtów. Tablice surowych bajtów zwykle nie mogą być interpretowane jako kodowanie znaków, takie jak UTF-8 , ponieważ nie każdy bajt w każdej kolejności jest legalnym kodowaniem. Więc konwertuj je na a String
z:
new String(md.digest(subject), StandardCharsets.UTF_8)
może tworzyć niedozwolone sekwencje lub ma wskaźniki kodu do niezdefiniowanych mapowań Unicode :
[�a�ɹ??�%l�3~��.
Kodowanie plików binarnych na tekst
W tym celu używane jest kodowanie binarne na tekst . W przypadku skrótów najczęściej używanym kodowaniem jest kodowanie HEX lub Base16 . Zasadniczo bajt może mieć wartość od 0
do 255
(lub -128
do ze znakiem 127
), która jest równoważna reprezentacji szesnastkowej 0x00
- 0xFF
. Dlatego hex podwoi wymaganą długość wyjścia, co oznacza, że 20-bajtowe wyjście utworzy ciąg o długości 40 znaków, np .:
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
Zauważ, że nie jest wymagane stosowanie kodowania szesnastkowego. Możesz też użyć czegoś takiego jak base64 . Hex jest często preferowany, ponieważ jest łatwiejszy do odczytania przez ludzi i ma określoną długość wyjściową bez potrzeby wypełniania.
Możesz przekonwertować tablicę bajtów na szesnastkową za pomocą samej funkcjonalności JDK:
new BigInteger(1, token).toString(16)
Zauważ jednak, że BigInteger
zinterpretuje podaną tablicę bajtów jako liczbę a nie jako ciąg bajtów. Oznacza to, że wiodące zera nie zostaną wyprowadzone, a wynikowy ciąg może być krótszy niż 40 znaków.
Używanie bibliotek do kodowania w formacie HEX
Możesz teraz skopiować i wkleić nieprzetestowaną metodę bajt-szesnastkowy ze Stack Overflow lub użyć ogromnych zależności, takich jak Guava .
Aby znaleźć rozwiązanie większości problemów związanych z bajtami, zaimplementowałem narzędzie do obsługi następujących przypadków: bytes-java (Github)
Aby przekonwertować tablicę bajtów skrótu wiadomości, możesz po prostu zrobić
String hex = Bytes.wrap(md.digest(subject)).encodeHex();
lub możesz po prostu użyć wbudowanej funkcji skrótu
String hex = Bytes.from(subject).hashSha1().encodeHex();
SHA1
bez łącznika, nie wiem, czy to coś zmieni.