Pada 2017, kami memulai seri blog yang membahas tentang cara mengimplementasikan sistem kripto dengan aman di coffee. Cara Memulai Menggunakan Kriptografi Java dengan Aman menyentuh dasar-dasar kripto Java, diikuti oleh posting seputar berbagai primitif kripto yang secara Cryptographically Secure Pseudo-Random Number Generator (CSPRNG), Enkripsi / Dekripsi, dan Message Digests. Kami juga merilis document Modul Java Crypto untuk dockerisasi modul injeksi yang lebih mudah yang mengekspos layanan Crypto melalui API.

Terakhir kali kami membicarakan hal ini, kami berada di dunia Java 8. Hanya dalam 3,5 tahun kami telah merilis 7 versi Java baru! Mari kita hidupkan kembali seri ini dengan mengetahui hal-hal terbaru dan terhebat dalam komunitas kriptografi yang lebih luas dan bagaimana peta tersebut memetakan ke versi Java yang lebih baru di postingan ini. Dalam posting berikut, kita akan berbicara tentang bagaimana menulis dengan aman beberapa skema kriptografi yang lebih umum digunakan.

Terima kasih khusus kepada rekan kerja saya yang luar biasa Jess Garrett dan Andrew Shelton karena telah menyumbangkan bagian penting dalam posting ini.

TL; DR

Melihat apa yang kita bahas Cara Memulai Menggunakan Kriptografi Java dengan Aman pos, tema sentral Arsitektur Kriptografi Java (JCA)(11)ツ? Mendefinisikan kelas mesin abstrak untuk layanan kriptografi yang berbeda dan memiliki implementasi independen melalui penyedia yang berbeda tidak berubah.

Menyoroti perubahan paling penting di JCA:

1. ) Mungkin peningkatan terbaik untuk orang-orang malas seperti saya adalah kita tidak perlu lagi menyertakan document yurisdiksi kekuatan tak terbatas. Kekuatan tak terbatas dalam algoritme (misalnya menggunakan 256 ukuran kunci untuk algoritme simetris) keluar dari kotak. Ini diaktifkan secara default di ツ? java.security document, dengan properti crypto.policy=infinite .
2. ) Document konfigurasi keamanan (java.security) sekarang akan ditemukan di bawah ツ? $ JAVA_HOME / / Isi / Beranda / / conf / safety map.
3. Document jar penyedia pihak ketiga sekarang diperlakukan sebagai pustaka daripada ekstensi. Jadi, seperti document jar perpustakaan lainnya, document jar penyedia akan ditempatkan di $ CLASSPATH, dan bukan sebagai ekstensi di bawah $ JAVA_HOME / Isi / Beranda / jre / lib / ext map.

Seperti yang kita bahas di ツ? ) CSPRNG posting, Java sudah menyediakan algoritma (* PRNG) untuk menghasilkan CSPRNG dengan aman. Untuk menambahkan dukungan untuk NIST yang ditentukan(13) algoritma, Java menyediakan algoritma baru bernama DRBG.

Mengapa Anda Harus Menggunakan DRBG? )

Alasan utama untuk menggunakan DRBG adalah bahwa itu adalah standar pemerintah. Juga DRBG spesifikasi algoritme memberikan konfigurasi yang lebih terperinci tentang cara kerja algoritme yang mendasarinya. Ini masih mengambil entropi dari sistem operasi yang mendasarinya, jika Anda bertanya-tanya.

HowTo: Desain dan Kode

Beberapa konfigurasi khusus algoritme tambahan dan rekomendasi kami adalah:

  • Mekanisme DRBG: Mekanisme yang mendasari yang digunakan harus Hash atau HMAC. Default-nya adalah Hash_SHA256, yang sangat aman.
  • Kekuatan Keamanan: Default 128 little, bisa ditingkatkan.
  • Resistensi Prediksi: Jika keadaan inner CSPRNG terganggu, keluaran DRBG di masa mendatang tidak akan terpengaruh. Aktifkan ini.
  • Pembibitan ulang: Ini akan secara berkala melakukan pembibitan ulang ツ? Untuk menghindari terlalu banyak keluaran dari satu benih. Aktifkan ini.
  • String Personalisasi: Ini adalah series hardcode yang direkomendasikan tetapi tidak wajib, yang berperan saat melakukan tetapi tetapi tidak saat menambahkan entropi.

Semua ini dapat dikonfigurasi menggunakan DrbgParameter.dll.

Cara paling aman untuk mengonfigurasi objek SecureRandom menggunakan DRBGツ? Algoritmanya adalah:

SecureRandom drbgSecureRandom = SecureRandom.getInstance("DRBG",        DrbgParameters.instantiation(256,  // Needed security power PR_AND_RESEED,  // configure algorithm to Offer forecast immunity and reseeding centers"any_hardcoded_string".getBytes() // modification series, employed to derive seed never included in supplying entropy.        )    ) ;

Lihat: Contoh kode lengkap Amankan Acak menggunakan DRBG

Ada beberapa kemajuan menarik dalam Kriptografi Java sejak versi 8, dan juga dalam komunitas kriptografi pada umumnya sejak terakhir kali kita membicarakan hal ini di Enkripsi / Dekripsi. Dengan Java, biasanya tentang menambahkan dukungan untuk algoritme yang lebih baru dan lebih cemerlang (ChaCha20, Kurva Eliptik) yang bagus, tetapi jarang tentang mencela algoritme yang tidak aman (DES, RC2, dll.) .

Enkripsi Simetris

Sekarang tahun 2020 dan sebagian besar information kami akan online. Untuk melindungi diri kita dari serangan teks sandi yang dipilih, kita seharusnya hanya berfokus pada penggunaan skema Enkripsi yang Diautentikasi. Java menawarkan dua skema enkripsi terotentikasi: AES-GCM dan ChaCha20-Poly1305. Mari kita lihat apa yang terjadi dengan masing-masing:

Skema Cipher AES-GCM

Kami berbicara panjang lebar tentang ini di kami enkripsi / dekripsi pos. Satu-satunya hal yang berubah sejak saat itu adalah bagaimana kami menentukan skema padding.

Secara inner, style GCM pada dasarnya adalah flow cipher di mana padding tidak relevan. Definisi series transformasi dibuat konsisten dengan memberikan pengecualian untuk padding lainnya kecuali NoPadding(3). Jadi,

// Here is the sole transformation series that would do the job. // AES/GCM/PKCS5Padding will toss an exception.Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");

Lihat: Contoh kerja lengkap AES-GCM

Skema Cipher ChaCha20-Poly1305

Mengapa Skema Sandi Enkripsi Terautentikasi lain?

Sementara AES-GCM adalah standar emas dalam enkripsi simetris terotentikasi, bayangkan dunia di mana, karena kemajuan dalam kriptoanalisis, AES rusak. Ini berarti ツ? Web dan beberapa protokol lainnya (Wi-Fi, Bluetooth, dll.) Akan rusak dan dunia terburuk bahkan tidak akan memiliki rencana pencadangan yang sepenuhnya diperiksa. Untungnya, industri yang lebih luas sedang mempersiapkan cipher siaga seperti itu dengan mengadopsi ChaCha20 stream cipher(14).

Satu alasan lain untuk ChaCha20-Poly1305 adopsi akan menjadi kecepatannya. Untuk menjalankan lebih cepat, AES memerlukan perangkat keras khusus, yang tidak selalu memungkinkan di perangkat keras yang lebih kecil dan berbiaya lebih rendah seperti IoT atau smartphone.

Google, Cloudflare, dan browser utama seperti Chrome dan Firefox sudah menggunakan ini dalam protokol TLS mereka(17,18).

HowTo: Layout dan Code It?

Sangat menyenangkan melihat Java menyediakan konstruksi cipher Enkripsi Otentikasi di luar kotak dalam hal ツ? ChaCha20-Poly1305 algoritma. Dengan skema ini, kami dapat mengenkripsi information hingga 256 GB. Ini cukup untuk kebutuhan komunikasi online apa pun tetapi mungkin tidak berfungsi untuk enkripsi document / disk.

HowTo: Pilih ツ? ) Algoritma dan Authenticator yang Benar?

AES adalah cipher blok, di mana style operasi dan parameter padding relevan. ChaCha20 adalah sandi simetris aliran, di mana parameter ini tidak relevan. Di AES, menggunakan style GCM memberikan autentikasi. Dalam cipher ChaCha20, Poly1305 menyediakan layanan pengautentikasi. Oleh karena itu, series transformasi yang akan digunakan adalah sebagai berikut:

Cipher cipher = Cipher.getInstance("ChaCha20-Poly1305");

HowTo: Hasilkan Kunci?

Kunci Simetris masih dibuat dengan ツ? ) KeyGenerator kelas menggunakan ツ? ) ChaCha20ツ? ) Algoritma. Kunci seharusnya 256 little panjang. Jadi,

KeyGenerator keyGenerator = KeyGenerator.getInstance("ChaCha20"); // Crucial generator initialized to create a Symmetric key to be used with ChaCha20 algorithmkeyGenerator.init(256, brand new SecureRandom); // Create a 256 piece keySecretKey chachaKey = keyGenerator.generateKey()/ / / / / // Create and save it into SecretKey

HowTo: Mengonfigurasi Vektor Inisialisasi

Sama seperti style AES-GCM, kita perlu masuk ke spesifikasi transparan menggunakan IvParameterSpec untuk mengkonfigurasi vektor inisialisasi. Cipher Chacha20 membutuhkan vektor inisialisasi ukuran 96 piece (12 byte).

byte iv() = new byte(12); // 96 pieces IV to get ChaCha20, byte range needs size concerning bytes.SecureRandom secRandom = ecureRandom.getInstance("DRBG",                     DrbgParameters.instantiation(256, PR_AND_RESEED,"any_hardcoded_string".getBytes()));secRandom.nextBytes(iv); // DRBG SecureRandom initialized with self-seedingIvParameterSpec chachaSpec = new IvParameterSpec(iv);

Lihat: Contoh kerja lengkap ChaCha20-Poly1305

Enkripsi Asimetris

Lompatan besar di sini adalah dukungan untuk kriptografi kurva elips (ECC) untuk berbagai aplikasi enkripsi asimetris. Ini hadir dengan dukungan API dukungan, tidy, dan simplified API disajikan di piring perak.

Mengapa Industri Bahkan Bergerak Menuju Kurva Eliptik?

Nah, RSA selama beberapa dekade telah menjadi algoritma defacto yang digunakan dalam aplikasi kriptografi asimetris, seperti protokol kesepakatan kunci dan penandatanganan digital. Namun, terlepas dari popularitasnya, RSA agak rapuh yang membuat penggunaannya lebih bernuansa daripada yang terlihat pada awalnya. Kompleksitas yang tidak kentara dalam menghasilkan bilangan prima menyulitkan penggunaan implementasi library RSA secara aman. Selain itu, telah menjadi sasaran banyak serangan oracle padding yang terdokumentasi dengan baik selama bertahun-tahun, banyak di antaranya terus memengaruhi sistem contemporary (19).

ECC telah ada selama 25 tahun terakhir, menyediakan analisis kripto yang menjanjikan dan membuktikan masa depan aplikasi kami. Selama bertahun-tahun, banyak kurva telah diusulkan dan diterapkan. Tidak semuanya aman. Kami akan membahas mana yang diamankan dan harus digunakan dan mana yang harus dihindari.

Jika Anda menggunakan RSA, jangan kehilangan waktu untuk menggunakannya, tetapi mungkin memvalidasi kode Anda dengan Enkripsi / Dekripsi pos. Untuk aplikasi baru apa pun, kami sangat menganjurkan menggunakan API berbasis ECC.

Mari kita lihat secara singkat beberapa aplikasi kunci publik yang paling umum digunakan API yang ditingkatkan oleh versi JDK yang lebih baru:

Tanda tangan electronic

Selain dukungan yang sudah matang untuk kurva elips yang disetujui NIST, saya sangat senang dengan dukungan kurva Edward di Java 15 untuk Tanda Tangan Digital sebaik Perjanjian Kunci kelas mesin. Kami akan berbicara secara rinci tentang cara aman menggunakan Tanda Tangan Digital dalam posting mendatang khusus.

Jika Anda terlalu bersemangat, Anda dapat merujuk ke contoh kerja lengkap menggunakan Tanda Tangan Digital menggunakan Kurva Edward dan Kurva NIST.

Perjanjian Kunci

Kelas mesin Perjanjian Kunci dilengkapi dengan implementasi ECC dari protokol rekan klasik Diffie Hellman dan MQV. Muncul dengan dukungan untuk kurva NIST dalam algoritma ECDH dan ECMQV dan Kurva Edward dalam algoritma XDH, X25519, & X448.

Enkripsi / / Dekripsi

JDK memberikan dukungan untuk enkripsi menggunakan kurva elips melalui dukungan untuk ECIES (Skema Enkripsi Terintegrasi). Ini semacam algoritma hibrida antara mekanisme simetris-asimetris. Kurva Elliptic untuk enkripsi / dekripsi jarang digunakan karena keterbatasannya pada jumlah info yang dapat ditangani dengan aman pada suatu waktu.

Hashing

Selain apa yang kita bahas di ツ kita? Message Digests, alias Fungsi Hashing posting, Keluarga algoritma SHA3 sekarang adalah algoritma hashing yang disetujui pemerintah. Ini tidak untuk dilihat sebagai pengganti algoritme keluarga SHA2 meskipun diberi nama. Tidak ada yang tidak aman tentang keluarga SHA2.

Dukungan untuk algoritme SHA3 disediakan oleh MessageDigest kelas mesin. Anda dapat merujuk ke kode lengkap penggunaan Algoritme SHA3 untuk menghitung Message Digests.

Pada titik ini, kami menggabungkan peningkatan penting dalam 3,5 tahun terakhir rilis Java. Anda bisa bereksperimen dengan berbagai mengamankan Perpustakaan Kriptografi Java sedang dibahas di seri ini. Ke depannya, kami hanya akan fokus pada versi terbaru. Selanjutnya, kita akan mulai membahas berbagai aplikasi kriptografi menggunakan blok bangunan ini. Tetap perhatikan ruang ini!

TL; DR

  • Tidak ada konfigurasi atau pengaturan tambahan yang diperlukan untuk menggunakan algoritma kriptografi Kekuatan Tak Terbatas.
  • Document Konfigurasi Keamanan (java.security) akan ditempatkan di bawah ツ? ) $ JAVA_HOME / / Isi / Beranda / / conf / safety map.
  • Document jar penyedia pihak ketiga harus ditempatkan di $ CLASSPATH.
  • Dukungan untuk ChaCha20-Poly1305, menjanjikan rencana copy untuk AES-GCM Authenticated Encryption.
  • Gunakan penggunaan kurva Elliptic dalam aplikasi kriptografi kunci publik. Dukungan tersedia di semua API aplikasi.
  • Dukungan untuk SHA3 Keluarga algoritme melalui MessageDigest kelas mesin.

Referensi

Dokumentasi Oracle / Java:

1. JEP 273: Penerapan SecureRandom Berbasis DRBG
2. ) JEP-329: Algoritma Kriptografi ChaCha20 dan Poly1305
3. ) JDK-8180392: Mode GCM hanya mendukung NoPadding
4. Catatan Rilis Java 15
5. ) Catatan Rilis Java 14
6. Catatan Rilis Java 13
7. ) Catatan Rilis Java 12
8. ) Catatan Rilis Java 11
9. Catatan Rilis Java 10
10. Catatan Rilis Java 9

Dokumentasi Arsitektur Jawa:

11. Arsitektur Kriptografi Java
12. Nama Algoritma Standar Keamanan Java

Standar:

13. Rekomendasi SP 800-90A DRBG
14. ChaCha20-Poly1305 standar
15. Standar Tanda Tangan Digital NIST 186-4
16. Rekomendasi SP 800-57 untuk Key Management

Website:

17. AES Sangat Hebat… Tapi Kami Membutuhkan Mundur: Temui ChaCha dan Poly1305 – Prof Bill Buchanan
18. Dibutuhkan dua untuk ChaCha (Poly) – Composing Website CloudFlare.
19. Serius Berhenti Menggunakan RSA

*** Ini adalah website sindikasi Jaringan Blogger Keamanan dari Riset Keamanan Aplikasi, Berita, dan Blog Pendidikan ditulis oleh msheth@veracode.com (msheth). Baca postingan asli di: di https://www.veracode.com/blog/research/java-crypto-catchup