Kelas Java SecureRandom

Java Top

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya

1. Perkenalan

Dalam tutorial singkat ini, kita akan belajar tentang java.security.SecureRandom, kelas yang menyediakan generator nomor acak yang kuat secara kriptografis.

2. Perbandingan dengan java.util.Random

Implementasi JDK standar java.util.Random menggunakan algoritme Linear Congruential Generator (LCG) untuk menyediakan bilangan acak. Masalah dengan algoritma ini adalah tidak kuat secara kriptografis. Dengan kata lain, nilai yang dihasilkan jauh lebih dapat diprediksi, oleh karena itu penyerang dapat menggunakannya untuk membahayakan sistem kami.

Untuk mengatasi masalah ini, kita harus menggunakan java.security.SecureRandom dalam setiap keputusan keamanan . Ini menghasilkan nilai acak yang kuat secara kriptografis dengan menggunakan generator nomor acak-semu yang kuat secara kriptografis (CSPRNG).

Untuk pemahaman yang lebih baik tentang perbedaan antara LCG dan CSPRNG, lihat bagan di bawah ini yang menyajikan distribusi nilai untuk kedua algoritme:

3. Menghasilkan Nilai Acak

Cara yang paling umum menggunakan SecureRandom adalah untuk menghasilkan int , panjang , mengambang , ganda atau boolean nilai-nilai :

int randomInt = secureRandom.nextInt(); long randomLong = secureRandom.nextLong(); float randomFloat = secureRandom.nextFloat(); double randomDouble = secureRandom.nextDouble(); boolean randomBoolean = secureRandom.nextBoolean();

Untuk menghasilkan nilai int kita bisa melewati batas atas sebagai parameter:

int randomInt = secureRandom.nextInt(upperBound);

Selain itu, kita dapat menghasilkan aliran nilai untuk int, double , dan long :

IntStream randomIntStream = secureRandom.ints(); LongStream randomLongStream = secureRandom.longs(); DoubleStream randomDoubleStream = secureRandom.doubles();

Untuk semua aliran, kami dapat mengatur ukuran aliran secara eksplisit:

IntStream intStream = secureRandom.ints(streamSize);

dan nilai asal (inklusif) dan terikat (eksklusif) juga:

IntStream intStream = secureRandom.ints(streamSize, originValue, boundValue);

Kami juga dapat menghasilkan urutan byte acak . Fungsi nextBytes () mengambil array byte yang disediakan pengguna dan mengisinya dengan byte acak :

byte[] values = new byte[124]; secureRandom.nextBytes(values);

4. Memilih Algoritma

Secara default, SecureRandom menggunakan algoritma SHA1PRNG untuk menghasilkan nilai acak. Kita bisa secara eksplisit membuatnya menggunakan algoritma lain dengan menjalankan metode getInstance () :

SecureRandom secureRandom = SecureRandom.getInstance("NativePRNG");

Membuat SecureRandom dengan operator baru sama dengan SecureRandom.getInstance (“SHA1PRNG”) .

Semua generator nomor acak yang tersedia di Java dapat ditemukan di halaman dokumen resmi.

5. Benih

Setiap contoh SecureRandom dibuat dengan benih awal. Ini berfungsi sebagai dasar untuk memberikan nilai dan perubahan acak setiap kali kita menghasilkan nilai baru.

Menggunakan operator baru atau memanggil SecureRandom.getInstance () akan mendapatkan seed default dari / dev / urandom .

Kita dapat mengubah seed dengan meneruskannya sebagai parameter konstruktor:

byte[] seed = getSecureRandomSeed(); SecureRandom secureRandom = new SecureRandom(seed);

atau dengan memanggil metode penyetel pada objek yang sudah dibuat:

byte[] seed = getSecureRandomSeed(); secureRandom.setSeed(seed);

Ingat bahwa jika kita membuat dua contoh SecureRandom dengan seed yang sama, dan urutan pemanggilan metode yang sama dibuat untuk masing-masing, mereka akan menghasilkan dan mengembalikan urutan angka yang identik.

6. Kesimpulan

Dalam tutorial ini, kita telah mempelajari cara kerja SecureRandom dan cara menggunakannya untuk menghasilkan nilai acak.

Seperti biasa, semua kode yang disajikan dalam tutorial ini dapat ditemukan di GitHub.

Jawa bawah

Saya baru saja mengumumkan kursus Learn Spring baru , yang berfokus pada dasar-dasar Spring 5 dan Spring Boot 2:

>> LIHAT KURSUSnya