Contoh Kode Aplikasi untuk Membuat Angka Acak di Android


Random Number Generator (RNG) adalah sejenis perangkat yang dapat menghasilkan rangkaian angka pada interval tertentu sehingga angka yang dihasilkan terlihat tidak dapat diprediksi. RNG adalah komponen yang sangat penting untuk aplikasi keamanan.

Sebuah protokol kriptografi mungkin memiliki kekuatan yang besar namun menderita dari banyakan serangan dikarenakan metode pembuatan kunci yang lemah di baliknya. RNG dapat digunakan untuk memperbaiki masalah ini sehingga meningkatkan keuatan kriptografis.

Artikel ini menyajikan gambaran umum tentang API pembuat angka acak dan juga menunjukkan bagaimanya caranya menggunakan beberapa API berbeda untuk membuat angka acak di sistem operasi Android.

Direkomendasikan bagi pembaca untuk mencoba fitur-fitur dan mengkompilkasikan kode sembari membaca artikel ini.

Aplikasi Random Number

Kode dan Penjelasan

Ada empat cara berbeda untuk membuat angka acak di Android:

  • java.util.random
  • java.security.SecureRandom
  • /dev/urandom
  • OpenSSL API

Jika kamu menggunakan RNG untuk membuat kunci kriptografi untuk mengamankan data kamu, class java.util.random dikenal mudah untuk diretas dan sebaiknya tidak digunakan. Tiga cara lainnya dapat menghasilkan kunci yang lebih kuat.

java.util.random

Menggunakan Java Random Number API itu mudah dan tidak rumit. Sebuah panggilan ke Random.nextInt() akan menghasilkan nilai acak 4-byte (dengan kemungkinan angka yang dihasilkan sebanyak 2^32). API ini bekerja dengan baik jika kamu tidak mengandalkan angka yang benar-benar acak.

for (int i = 0; i < lastVal; i += 2) {
	dataRandomPoints[i] = (rand.nextInt() % widget_width);
	dataRandomPoints[i+1] = (rand.nextInt() % widget_height);

}

java.security.SecureRandom

SecureRandom mirip dengan java.util.Random di mana kamu dapat membuat panggilan SecureRandom.nextInt() untuk menghasilkan angka acak 4-byte. Secara kriptografi SecureRandom itu kuat walaupun para pengembang aplikasi sebaiknya mengetahui bahwa rekomendasi baru-baru ini mengatakan untuk memberikan seed ke SecureRandom dengan byte yang dihasilkan dari /dev/urandom sebelum membuat angka acak.

Contoh di bawah ini tidak menggunakan seed dari /dev/urandom.

SecureRandom srand = new SecureRandom();
shouldDraw = (srand.nextInt() % randomMod );

/dev/urandom

Sistem operasi Linux (termasuk Android) memiliki sebuah berkas khusus yang dibuat oleh kernel yang dapat memberikan angka acak ke aplikasi. Cara ini paling lambat dari keempat cara membuat angka acak tapi menghasilkan angka entropi tinggi yang aman secara kriptografi dengan menggabungkan data dari bagian-bagian di sistem operasi (contohnya driver perangkat) ke dalam RNG.

Kita bisa mendapat angka acak langsung dari kernel dengan membaca dari berkas /dev/urandom. /dev/urandom akan mengakses perangkat RNG jika tersedia.

unsigned int cKeyBuffer[keysize];
memset(cKeyBuffer, 0, sizeof(unsigned int) * keysize);

FILE *fin;
strcpy(filein, "/dev/urandom");
fin = fopen(filein, "rb");

if (fin != NULL) {
	fread(cKeyBuffer, sizeof(int), keysize, fin);
	fclose (fin);
}

OpenSSL API

Kita dapat juga menggunakan Open SSL API untuk mendapatkan angka acak di dalam kode native (C). Kamu bisa lihat bahwa OpenSSL dapat di-seed dengan byte dari /dev/urandom dan kemudian dapat digunakan untuk membuat angka acak yang aman secara kriptografi. OpenSSL API dapat mengakses perangkat RNG jika tersedia.

int seedbytes = 1024;
unsigned int cKeyBuffer[keysize];
memset(cKeyBuffer, 0, sizeof(unsigned int) * keysize);

if (!opensslIsSeeded) {

	if (!RAND_load_file("/dev/urandom", seedbytes)) {
		__android_log_print(ANDROID_LOG_ERROR, TAG, "Failed to seed OpenSSL RNG");
		return jKeyBuffer;
	}

	opensslIsSeeded = 1;
}

if (!RAND_bytes((unsigned char *)cKeyBuffer, keysize * sizeof(int))) {
	__android_log_print(ANDROID_LOG_ERROR, TAG, "Faled to create OpenSSSL random integers: %ul", ERR_get_error);
}

Kesimpulan

Dengan mengimplementasikan kode seperti contoh di artikel ini, kamu dapat dengan cepat mempelajari bagaimana caranya untuk menggunakan empat cara yang berbeda untuk membuat angka acak.

Untuk mengunduh contoh kode dari artikel ini, bisa mengunjungi link ini.

* Artikel ini adalah hasil kerja sama dengan Intel Developer Zone. Artikel asli bisa dilihat di link ini.