5 Ağustos 2019 Pazartesi

SecureRandom Sınıfı

Giriş
Şu satırı dahil ederiz. Random sınıfından kalıtır.
import java.security.SecureRandom;
import java.util.Random;
Bu sınıf Linux'ta /dev/random dosyasını okuduğu için sistemin entropi havuzu boş ise havuzun dolmasını bekleyebiliyor. Bloke olmayan /dev/urandom dosyasını kullanması için şöyle yaparız.
-Djava.security.egd=file:/dev/./urandom
Kötü Kullanım
Şu kullanımda seed verilmiyor.
SecureRandom random = new SecureRandom();
byte[] key = new byte[16];
random.nextBytes(key);
Şöyle yaparız
SecureRandom random = new SecureRandom();

byte[] seed = new byte[32];
random.nextBytes(seed);
random.setSeed(seed);

byte[] key = new byte[16];
random.nextBytes(key);
Açıklaması şöyle
In this example, the application is using a SecureRandom object to generate a 16-byte key, but the SecureRandom object is not properly seeded with random data. This could potentially make the key predictable and vulnerable to attack.

One way to fix this vulnerability is to properly seed the SecureRandom object with random data, such as by using a hardware random number generator or by collecting entropy from user input or system events. 

in this example, we’re first generating a random seed for the SecureRandom object, and then using that seed to properly seed the
constructor 
Şöyle yaparız.
Random random = new SecureRandom();
constructor - string
Şöyle yaparız.
SecureRandom secureRandomGenerator = SecureRandom.getInstance("SHA1PRNG");
getInstanceStrong metodu
Şöyle yaparız.
// Java 7
SecureRandom random = new SecureRandom();
// Java 8
SecureRandom random = SecureRandom.getInstanceStrong();
ints metodu
Şöyle yaparız
SecureRandom random = new SecureRandom();
IntStream stream = random.ints();
longs metodu
Şöyle yaparız
Iterator<Long> iterator = new SecureRandom().longs.distinct().iterator();
nextBytes metodu
Belirtilen diziyi rastgele byte ile doldurur.
Örnek
Şöyle yaparız.
SecureRandom random = new SecureRandom();
byte bytes[] = new byte[20];
random.nextBytes(bytes);
Örnek
Şöyle yaparız.
Random RANDOM = new SecureRandom();

/**
 * Returns a random salt to be used to hash a password.
 *
 * @return a 16 bytes random salt
 */
public static byte[] getNextSalt() {
  byte[] salt = new byte[16];
  RANDOM.nextBytes(salt);
  return salt;
}

Hiç yorum yok:

Yorum Gönder