Saya mencoba membuat konverter String to SHA1 sederhana di Java dan ini yang saya dapatkan ...
public static String toSHA1(byte[] convertme) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA-1");
}
catch(NoSuchAlgorithmException e) {
e.printStackTrace();
}
return new String(md.digest(convertme));
}
Ketika saya lulus toSHA1("password".getBytes())
, saya [�a�ɹ??�%l�3~��.
tahu saya mungkin memperbaiki encoding sederhana seperti UTF-8, tetapi bisakah seseorang memberi tahu saya apa yang harus saya lakukan untuk mendapatkan apa yang saya inginkan 5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
? Atau apakah saya melakukan ini sepenuhnya salah?
SHA1
tanpa tanda hubung, tidak tahu apakah itu akan membuat perbedaan.getBytes()
, misalnya gunakantoSHA1("password".getBytes("UTF-8"))
Jawaban:
PEMBARUAN
Anda dapat menggunakan Apache Commons Codec (versi 1.7+) untuk melakukan pekerjaan ini untuk Anda.
Terima kasih kepada @ Jon Onstott untuk saran ini.
Jawaban Lama
Konversi Byte Array Anda ke Hex String. Cara Nyata memberitahu Anda caranya .
dan (disalin dari Real's How To)
BTW, Anda bisa mendapatkan representasi yang lebih kompak menggunakan Base64. Apache Commons Codec API 1.4 , memiliki utilitas yang bagus untuk menghilangkan semua rasa sakit. lihat disini
sumber
DigestUtils.sha1Hex("my string")
alih - alih menciptakan kembali roda (meskipun menarik mengetahui cara mengonversi ke hex dengan tangan)?Ini adalah solusi saya untuk mengubah string menjadi sha1. Ini bekerja dengan baik di aplikasi Android saya:
sumber
encryptPassword("test")
danecho test|sha1sum
di terminal linux menghasilkan hasil yang sama? Mereka tidak melakukannya.echo test
, output termasuk jeda baris akan disalurkan kesha1sum
. Jika Anda ingin meng-hash string biasa tanpa mengekstrak line break, Anda bisa menggunakannyaecho -n test | sha1sum
. The-n
parameter membuatecho
menghilangkan garis istirahat.encryptPassword()
Suara Anda seperti itu digunakan untuk menyimpan data otentikasi. Perhatikan bahwa pengkodean Anda rentan terhadap serangan kamus, karena tidak ada seeding yang diterapkan. Periksa lingkungan keamanan Anda apakah ini merupakan masalah untuk aplikasi Anda!Menggunakan kelas Jambu Hashing :
sumber
SHA-1 (dan semua algoritma hashing lainnya) mengembalikan data biner. Itu berarti (di Jawa) mereka menghasilkan a
byte[]
. Itubyte
array yang tidak tidak mewakili karakter tertentu, yang berarti Anda tidak bisa hanya mengubahnya menjadiString
seperti yang Anda lakukan.Jika Anda memerlukan
String
, maka Anda harus memformatnyabyte[]
dengan cara yang dapat direpresentasikan sebagaiString
(jika tidak, simpan sajabyte[]
).Dua cara umum untuk mewakili
byte[]
karakter sewenang - wenang sebagai karakter yang dapat dicetak adalah BASE64 atau hex-Strings sederhana (yaitu masing-masing mewakilibyte
dua digit heksadesimal). Sepertinya Anda mencoba menghasilkan hex-String.Ada juga jebakan lain: jika Anda ingin mendapatkan SHA-1 dari Java
String
, maka Anda perlu mengubahnyaString
menjadi yangbyte[]
pertama (karena input dari SHA-1byte[]
juga). Jika Anda hanya menggunakanmyString.getBytes()
seperti yang Anda tunjukkan, maka itu akan menggunakan pengkodean default platform dan karenanya akan bergantung pada lingkungan tempat Anda menjalankannya (misalnya, itu bisa mengembalikan data yang berbeda berdasarkan pengaturan bahasa / lokal OS Anda).Sebuah solusi yang lebih baik adalah untuk menetapkan pengkodean untuk digunakan untuk
String
-to-byte[]
konversi seperti ini:myString.getBytes("UTF-8")
. Memilih UTF-8 (atau penyandian lain yang dapat mewakili setiap karakter Unicode) adalah pilihan paling aman di sini.sumber
Ini adalah solusi sederhana yang dapat digunakan saat mengonversi string ke format hex:
sumber
Cukup gunakan pustaka codec apache commons. Mereka memiliki kelas utilitas yang disebut DigestUtils
Tidak perlu masuk ke detail.
sumber
String result = DigestUtils.sha1Hex("An input string")
o)Seperti yang disebutkan sebelumnya gunakan apache commons codec. Ini direkomendasikan oleh Spring guys juga (lihat DigestUtils di Spring doc). Misalnya:
Jelas tidak akan menggunakan jawaban berperingkat teratas di sini.
sumber
Ini tidak mencetak dengan benar karena Anda harus menggunakan pengkodean Base64. Dengan Java 8 Anda dapat menyandikan menggunakan kelas encoder Base64 .
Hasil
Ini akan memberi Anda hasil yang diharapkan dari
5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8
sumber
Pesan Intisari (hash) adalah byte [] dalam byte [] keluar
Intisari pesan didefinisikan sebagai fungsi yang mengambil array byte mentah dan mengembalikan array byte mentah (alias
byte[]
). Misalnya SHA-1 (Secure Hash Algorithm 1) memiliki ukuran digest 160 bit atau 20 byte. Array byte mentah biasanya tidak dapat diartikan sebagai pengkodean karakter seperti UTF-8 , karena tidak setiap byte dalam setiap order adalah legal yang encoding. Jadi mengubahnya menjadiString
:mungkin membuat beberapa urutan ilegal atau memiliki penunjuk kode ke pemetaan Unicode yang tidak terdefinisi :
Encoding biner-ke-teks
Untuk itu digunakan pengkodean biner-ke-teks . Dengan hash, yang paling banyak digunakan adalah penyandian HEX atau Base16 . Pada dasarnya satu byte dapat memiliki nilai dari
0
ke255
(atau-128
ke127
ditandatangani) yang setara dengan representasi HEX dari0x00
-0xFF
. Oleh karena itu hex akan menggandakan panjang output yang diperlukan, itu berarti output 20 byte akan membuat string hex panjang 40 karakter, misalnya:Perhatikan bahwa tidak perlu menggunakan pengkodean hex. Anda juga bisa menggunakan sesuatu seperti base64 . Hex sering disukai karena lebih mudah dibaca oleh manusia dan memiliki panjang keluaran yang ditentukan tanpa perlu bantalan.
Anda dapat mengonversi array byte ke hex dengan fungsi JDK saja:
Namun perlu dicatat bahwa
BigInteger
akan menafsirkan array byte yang diberikan sebagai angka dan bukan sebagai string byte. Itu berarti nol di depan tidak akan dikeluarkan dan string yang dihasilkan mungkin lebih pendek dari 40 karakter.Menggunakan Perpustakaan untuk Menyandikan ke HEX
Anda sekarang dapat menyalin dan menempelkan metode byte-to-hex yang belum diuji dari Stack Overflow atau menggunakan dependensi besar seperti Guava .
Untuk memiliki solusi masuk untuk sebagian besar masalah terkait byte, saya menerapkan utilitas untuk menangani kasus ini: bytes-java (Github)
Untuk mengonversi array byte intisikan pesan Anda, Anda cukup melakukannya
atau Anda bisa menggunakan fitur hash bawaan
sumber
Base 64 Representasi
SHA1
Hash:sumber
Alasan ini tidak berhasil adalah ketika Anda menelepon
String(md.digest(convertme))
, Anda memberi tahu Java untuk menafsirkan urutan byte terenkripsi sebagai String. Yang Anda inginkan adalah mengubah byte menjadi karakter heksadesimal.sumber
Konversi byte array menjadi hex string.
sumber