Pengenalan kepada Jasypt

1. Gambaran keseluruhan

Dalam artikel ini, kita akan melihat perpustakaan Jasypt (Java Simplified Encryption).

Jasypt adalah perpustakaan Java yang membolehkan pemaju menambahkan kemampuan penyulitan asas untuk projek dengan usaha minimum, dan tanpa perlu memiliki pengetahuan mendalam mengenai perincian pelaksanaan protokol enkripsi.

2. Menggunakan Penyulitan Mudah

Pertimbangkan kami sedang membina aplikasi web di mana pengguna menyerahkan data peribadi akaun. Kita perlu menyimpan data tersebut dalam pangkalan data, tetapi tidak selamat untuk menyimpan teks biasa.

Salah satu cara untuk mengatasinya adalah dengan menyimpan data yang dienkripsi dalam pangkalan data, dan ketika mengambil data tersebut untuk pengguna tertentu mendekripsikannya.

Untuk melakukan penyulitan dan penyahsulitan menggunakan algoritma yang sangat mudah, kita dapat menggunakan kelas BasicTextEncryptor dari perpustakaan Jasypt:

BasicTextEncryptor textEncryptor = new BasicTextEncryptor(); String privateData = "secret-data"; textEncryptor.setPasswordCharArray("some-random-data".toCharArray());

Kemudian kita boleh menggunakan kaedah enkripsi () untuk mengenkripsi teks biasa:

String myEncryptedText = textEncryptor.encrypt(privateData); assertNotSame(privateData, myEncryptedText);

Sekiranya kita ingin menyimpan data peribadi untuk pengguna tertentu dalam pangkalan data, kita dapat menyimpan myEncryptedText tanpa melanggar sekatan keselamatan. Sekiranya kita mahu mendekripsi data kembali ke teks biasa, kita boleh menggunakan kaedah dekripsi () :

String plainText = textEncryptor.decrypt(myEncryptedText); assertEquals(plainText, privateData);

Kami melihat bahawa data yang didekripsi sama dengan data teks biasa yang sebelumnya dienkripsi.

3. Penyulitan Sehala

Contoh sebelumnya bukanlah cara yang ideal untuk melakukan pengesahan, iaitu ketika kita ingin menyimpan kata laluan pengguna. Sebaik-baiknya, kami ingin menyulitkan kata laluan tanpa kaedah untuk menyahsulitnya. Apabila pengguna cuba masuk ke perkhidmatan kami, kami menyulitkan kata laluannya dan membandingkannya dengan kata laluan yang dienkripsi yang disimpan dalam pangkalan data. Dengan cara itu kita tidak perlu menggunakan kata laluan teks biasa.

Kita boleh menggunakan kelas BasicPasswordEncryptor untuk melakukan penyulitan sehala:

String password = "secret-pass"; BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor(); String encryptedPassword = passwordEncryptor.encryptPassword(password); 

Kemudian, kita dapat membandingkan kata laluan yang sudah dienkripsi dengan kata laluan pengguna yang melakukan proses log masuk tanpa perlu menyahsulitkan kata laluan yang sudah disimpan dalam pangkalan data:

boolean result = passwordEncryptor.checkPassword("secret-pass", encryptedPassword); assertTrue(result);

4. Mengkonfigurasi Algoritma untuk Penyulitan

Kita boleh menggunakan algoritma enkripsi yang lebih kuat tetapi kita perlu ingat untuk memasang Java Policy Crystography Extension (JCE) Unlimited Strength Jurisdiction Poles untuk JVM kami (arahan pemasangan disertakan dalam muat turun)

Di Jasypt kita dapat menggunakan enkripsi yang kuat dengan menggunakan kelas StandardPBEStringEncryptor dan menyesuaikannya dengan kaedah setAlgorithm () :

StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); String privateData = "secret-data"; encryptor.setPassword("some-random-passwprd"); encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

Mari tetapkan algoritma penyulitan menjadi PBEWithMD5AndTripleDES.

Seterusnya, proses penyulitan dan penyahsulitan kelihatan sama seperti yang sebelumnya menggunakan kelas BasicTextEncryptor :

String encryptedText = encryptor.encrypt(privateData); assertNotSame(privateData, encryptedText); String plainText = encryptor.decrypt(encryptedText); assertEquals(plainText, privateData);

5. Menggunakan Penyahsulitan Berbilang Benang

Semasa kami menggunakan mesin pelbagai teras, kami mahu menangani proses penyahsulitan secara selari. Untuk mencapai prestasi yang baik kita boleh menggunakan PooledPBEStringEncryptor dan setPoolSize () API untuk membuat kumpulan digester. Masing-masing boleh digunakan oleh benang yang berbeza secara selari:

PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor(); encryptor.setPoolSize(4); encryptor.setPassword("some-random-data"); encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

Sebaiknya tetapkan ukuran kolam agar sama dengan bilangan teras mesin. Kod untuk penyulitan dan penyahsulitan adalah sama dengan yang sebelumnya.

6. Penggunaan dalam Kerangka Lain

Catatan akhir yang cepat adalah bahawa perpustakaan Jasypt dapat disatukan dengan banyak perpustakaan lain, termasuk tentu saja Spring Framework.

Kami hanya perlu membuat konfigurasi untuk menambahkan sokongan enkripsi ke dalam aplikasi Spring kami. Dan jika kita ingin menyimpan data sensitif ke dalam pangkalan data dan kita menggunakan Hibernate sebagai kerangka akses data, kita juga dapat mengintegrasikan Jasypt dengannya.

Petunjuk mengenai integrasi ini, serta beberapa kerangka kerja lain, boleh didapati di bahagian Panduan di laman utama Jasypt.

7. Kesimpulannya

Dalam artikel ini, kami melihat perpustakaan Jasypt yang membantu kami membuat aplikasi yang lebih selamat dengan menggunakan algoritma kriptografi yang sudah diketahui dan diuji. Ia ditutup dengan API ringkas yang mudah digunakan.

Pelaksanaan semua contoh dan coretan kod ini terdapat dalam projek GitHub - ini adalah projek Maven, jadi mudah untuk diimport dan dijalankan sebagaimana adanya.