İleti Özeti (karma) bayt [], bayt [] çıkışında
İleti özeti, ham bayt dizisini alan ve ham bayt dizisini (aka byte[]
) döndüren bir işlev olarak tanımlanır . Örneğin SHA-1 (Güvenli Karma Algoritma 1) , 160 bit veya 20 baytlık bir sindirim boyutuna sahiptir. Ham bayt dizileri genellikle yorumlanamaz karakter kodlamaları gibi UTF-8 her sırayla değil her bayt kodlama dair bir yasal olduğundan,. Yani onları a String
ile dönüştürmek :
new String(md.digest(subject), StandardCharsets.UTF_8)
bazı yasadışı diziler oluşturabilir veya tanımlanmamış Unicode eşlemeleri için kod işaretçileri olabilir :
[�a�ɹ??�%l�3~��.
İkiden Metne Kodlama
Bunun için ikili-metin kodlaması kullanılır. Karma ile en çok kullanılanı HEX kodlaması veya Base16'dır . Temel olarak, bir bayt değeri olabilir 0
için 255
(veya -128
ile 127
HEX gösterimine denk imzalı) 0x00
- 0xFF
. Bu nedenle hex, çıktının gerekli uzunluğunu iki katına çıkaracaktır, yani 20 baytlık bir çıktı 40 karakter uzunluğunda bir hex dizgisi oluşturacaktır, örneğin:
2fd4e1c67a2d28fced849ee1bb76e7391b93eb12
Onaltılık kodlama kullanılmasının gerekli olmadığını unutmayın. Ayrıca base64 gibi bir şey kullanabilirsiniz . Hex genellikle tercih edilir, çünkü insanlar tarafından daha kolay okunabilir ve dolguya ihtiyaç duyulmadan tanımlı bir çıkış uzunluğuna sahiptir.
Bir bayt dizisini yalnızca JDK işlevselliği ile hex'e dönüştürebilirsiniz:
new BigInteger(1, token).toString(16)
Bununla birlikte, BigInteger
verilen bayt dizisini bayt dizesi olarak değil sayı olarak yorumlayacağına dikkat edin . Bu, baştaki sıfırların çıkmayacağı ve sonuçtaki dizenin 40 karakterden kısa olabileceği anlamına gelir.
HEX Kodlaması için Kütüphaneleri Kullanma
Artık Yığın Taşması'ndan denenmemiş bir bayt-onaltılık yöntemini kopyalayıp yapıştırabilir veya Guava gibi büyük bağımlılıklar kullanabilirsiniz .
Baytla ilgili sorunların çoğuna yönelik bir çözüm bulmak için, bu durumları ele alacak bir yardımcı program uyguladım: bytes-java (Github)
Mesaj özet bayt dizinizi dönüştürmek için
String hex = Bytes.wrap(md.digest(subject)).encodeHex();
veya yerleşik karma özelliğini kullanabilirsiniz
String hex = Bytes.from(subject).hashSha1().encodeHex();
SHA1
kısa çizgi içermiyor, bunun bir fark yaratıp yaratmayacağını bilmiyorum.