Kelas Java SecureRandom

Java Teratas

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

>> SEMAK KURSUS

1. Pengenalan

Dalam tutorial ringkas ini, kita akan belajar mengenai java.security.SecureRandom, kelas yang menyediakan penjana nombor rawak yang kuat secara kriptografi.

2. Perbandingan dengan java.util.Rawak

Pelaksanaan JDK standard java.util.Random menggunakan algoritma Linear Congruential Generator (LCG) untuk memberikan nombor rawak. Masalah dengan algoritma ini ialah ia tidak kuat secara kriptografi. Dengan kata lain, nilai yang dihasilkan jauh lebih dapat diramalkan, oleh itu penyerang dapat menggunakannya untuk menjejaskan sistem kita.

Untuk mengatasi masalah ini, kita harus menggunakan java.security.SecureRandom dalam sebarang keputusan keselamatan . Ia menghasilkan nilai rawak kriptografi kuat dengan menggunakan penjana nombor pseudo-rawak kuat kriptografi (CSPRNG).

Untuk pemahaman yang lebih baik mengenai perbezaan antara LCG dan CSPRNG, sila lihat carta di bawah ini yang menunjukkan taburan nilai untuk kedua-dua algoritma:

3. Menjana Nilai Rawak

Cara yang paling biasa menggunakan SecureRandom adalah untuk menjana int , panjang , float , double atau boolean 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 dapat melewati batas atas sebagai parameter:

int randomInt = secureRandom.nextInt(upperBound);

Di samping itu, kita dapat menghasilkan aliran nilai untuk int, dua dan panjang :

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

Untuk semua aliran, kami dapat menetapkan 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 bait rawak . Fungsi nextBytes () mengambil array byte yang dibekalkan pengguna dan mengisinya dengan bait rawak :

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

4. Memilih Algoritma

Secara lalai, SecureRandom menggunakan algoritma SHA1PRNG untuk menghasilkan nilai rawak. Kami secara eksplisit dapat menggunakannya menggunakan algoritma lain dengan menggunakan kaedah getInstance () :

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

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

Semua penjana nombor rawak yang terdapat di Java boleh didapati di halaman dokumen rasmi.

5. Benih

Setiap contoh SecureRandom dibuat dengan pilihan awal. Ia berfungsi sebagai asas untuk memberikan nilai dan perubahan secara rawak setiap kali kita menghasilkan nilai baru.

Dengan menggunakan operator baru atau memanggil SecureRandom.getInstance () akan mendapat pilihan lalai dari / dev / urandom .

Kita boleh mengubah benih dengan menyebarkannya sebagai parameter pembina:

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

atau dengan menggunakan kaedah setter pada objek yang sudah dibuat:

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

Ingat bahawa jika kita membuat dua contoh SecureRandom dengan pilihan yang sama, dan urutan panggilan kaedah yang sama dibuat untuk setiap satu, mereka akan menghasilkan dan mengembalikan urutan nombor yang sama.

6. Kesimpulannya

Dalam tutorial ini, kami telah belajar bagaimana SecureRandom berfungsi dan bagaimana menggunakannya untuk menghasilkan nilai rawak.

Seperti biasa, semua kod yang ditunjukkan dalam tutorial ini boleh didapati di GitHub.

Bahagian bawah Java

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

>> SEMAK KURSUS