ENKRIPSI DATA PADA MySQL

ENKRIPSI DATA PADA MySQL
Antonius Aditya Hartanto

Permasalahan enkripsi data biasanya muncul ketika anda membuat aplikasi yang berhubungan dengan password. Anda diminta untuk menyimpan data user beserta passwordnya yang tidak mungkin dibaca oleh orang lain bahkan oleh seorang administrator. Oleh karena ini data password tersebut perlu untuk di enkripsi. Enkripsi sendiri merupakan proses pengaburan data password semula ke dalam bentuk lain yang tidak mudah ditebak, namun dapat dikembalikan lagi ke bentuk semula jika diperlukan. Karena alasan keamananlah, maka enkripsi banyak digunakan pada proses authentifikasi di dalam database.
Jika anda menggunakan database MySQL, terdapat dua buah fungsi untuk mengenkripsi data yang paling sering digunakan, pertama adalah password ( ) dan kedua adalah encrypt ( ). Fungsi encrypt merupakan fungsi bawaan dari Unix yang bernama crypt. Fungsinya tentu saja adalah untuk meng-enkripsi data. Untuk memperjelas penjelasan tentang enkripsi data pada mysql, saya coba menerapkannya pada sebuah tabel bernama ‘user’ dengan dua buah kolom yaitu ‘name’ dan ‘password’. Sebagai contoh awal, saya akan menjelaskan terlebih dahulu mengenai perintah password ( ).

mysql> INSERT INTO user values(‘adit1’, password(‘aditya’));
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO user values(‘adit2’, password(‘aditya’));
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM user;

+——-+——————+
| name | password |
+——-+——————+
| adit2 | 05bf00c242eaee8e |
| adit1 | 05bf00c242eaee8e |
+——-+——————+
2 rows in set (0.00 sec)

Perhatikanlah secara seksama, untuk memanfaatkan perintah password ini, anda hanya perlu menuliskan perintah ini diikuti dengan kata yang akan dienkripsi, dalam contoh diatas adalah password(‘aditya’). Selanjutnya kata ‘aditya’ akan dienkripsi, dan hasilnya dapat dilihat dalam dua contoh diatas untuk user name ‘adit1’ dan ‘adit2’ ternyata hasilnya sama persis. Akan tetapi perhatikanlah apabila anda mencoba dengan menggunakan perintah encrypt sebagai berikut :

mysql> INSERT INTO user values(‘adit3’, encrypt(‘aditya’));
Query OK, 1 row affected (0.00 sec)

mysql> INSERT INTO user values(‘adit4’, encrypt(‘aditya’));
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM user;
+——-+——————+
| name | password |
+——-+——————+
| adit3 | 28RKg.Y01Y9RE |
| adit4 | B8INV5toweKv2 |
| adit2 | 05bf00c242eaee8e |
| adit1 | 05bf00c242eaee8e |
+——-+——————+
4 rows in set (0.00 sec)

Hasilnya dapat anda lihat bahwa kedua hasil enkripsi untuk kata yang sama tersebut tenyata sangat berbeda satu sama lain. Mengapa hal ini terjadi ? Ternyata fungsi encrypt() menggunakan cara pemanggilan fungsi standar UNIX untuk enkripsi yaitu crypt() yang berarti bahwa cara tersebut menggunakan sebuah kata terdiri atas dua buah karakter acak sebagai password peng-enkripsinya. Nilai hasil kembaliannya jika anda tidak mendefinisikannya akan berbeda-beda, meskipun kata yang dienkripsinya sama persis. Untuk lebih jelas, cobalah perintah berikut :

mysql> INSERT INTO user values(‘adit5’, encrypt(‘aditya’, ‘a1’));
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO user values(‘adit6’, encrypt(‘aditya’, ‘a1’));
Query OK, 1 row affected (0.01 sec)
mysql> SELECT * FROM user;

+——-+——————+
| name | password |
+——-+——————+
| adit3 | 28RKg.Y01Y9RE |
| adit4 | B8INV5toweKv2 |
| adit5 | a1UOXpafoUJX2 |
| adit6 | a1UOXpafoUJX2 |
| adit2 | 05bf00c242eaee8e |
| adit1 | 05bf00c242eaee8e |
+——-+——————+

6 rows in set (0.00 sec)

Sekarang perhatikan bahwa password pada name ‘adit3’ dan ‘adit4’ merupakan hasil proses enkripsi yang pertama yang belum menggunakan password peng-enkripsi, sedangkan password pada name ‘adit5’ dan ‘adit6’ merupakan hasil proses enkripsi kedua yang telah menggunakan password peng-enkripsi, yaitu ‘a1’. Selain hasilnya tetap sama untuk sebuah kata yang dienkripsi, hasil enkripsinya diawali dengan dua buah karakter dari password peng-enkripsinya. Apakah benar hanya dua buah karakter saja yang dapat digunakan sebagai password pengenkripsinya ? Jawaban pertanyaan tersebut dapat anda lihat berikut ini :

mysql> INSERT INTO user values(‘adit7’, encrypt(‘aditya’, ‘adit’));
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO user values(‘adit8’, encrypt(‘aditya’, ‘adit’));
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM user;
+——-+——————+
| name | password |
+——-+——————+
| adit3 | 28RKg.Y01Y9RE |
| adit4 | B8INV5toweKv2 |
| adit5 | a1UOXpafoUJX2 |
| adit6 | a1UOXpafoUJX2 |
| adit2 | 05bf00c242eaee8e |
| adit1 | 05bf00c242eaee8e |
| adit7 | ad2GgJP5tJDoU |
| adit8 | ad2GgJP5tJDoU |
+——-+——————+
8 rows in set (0.01 sec)
Dalam contoh tersebut, saya mencoba untuk meng-enkripsi data ‘aditya’ dengan jumlah karakter password peng-enkripsinya lebih dari dua karakter, dalam hal ini password peng-enkripsinya adalah ‘adit’ berjumlah empat karakter. Hasilnya dapat anda saksikan, bahwa ternyata ‘tetap’ hanya dua karakter pertamanya saja yang digunakan sebagai password peng-enkripsi. Anda tentunya bertanya, bagaimana jika password peng-enkripsinya satu karakter saja ? Untuk itu cobalah perintah berikut ini :
mysql> SELECT encrypt(‘aditya’,’a’);
+———————–+
| encrypt(‘aditya’,’a’) |
+———————–+
| NULL |
+———————–+
1 row in set (0.00 sec)
mysql> SELECT encrypt(‘aditya’,’a’);
+———————–+
| encrypt(‘aditya’,’a’) |
+———————–+
| NULL |
+———————–+
1 row in set (0.00 sec)

Anda lihat bagaimana hasilnya bukan ? Ternyata data hasil enkripsi adalah NULL. Berarti perintah encrypt ketika password peng-enkripsinya tidak dicantumkan, akan tetap meng-enkripsi data tersebut, namun dengan dua buah karakter peng-enkripsi yang dipilih secara acak. Hasilnya dapat anda lihat bahwa untuk beberapa data yang sama, hasil enkripsinya tentu saja berbeda. Sebuah pembuktian yang lebih akurat adalah cobalah anda enkripsi data dari name=’adit3’ dengan password peng-enkripsi yang sama dengan nilai password dari data tersebut yaitu ‘28RKg.Y01Y9RE’, seperti berikut :

mysql> SELECT encrypt(‘aditya’,’28RKg.Y01Y9RE’);
+———————————–+
| encrypt(‘aditya’,’28RKg.Y01Y9RE’) |
+———————————–+
| 28RKg.Y01Y9RE |
+———————————–+
1 row in set (0.01 sec)

Jadi terlihat karakter-karakter peng-enkripsi dari data ‘adit3’ adalah 28. Data ini dipilih secara acak karena tidak ditentukan sebelumnya. Jadi jelas bukan mengapa dapat berbeda untuk enkripsi data yang sama. Dari hasil-hasil tersebut dapat disimpulkan bahwa fungsi password(‘kata_yang_dienkripsi’) akan memperhitungkan bahwa sebuah password hasil enkripsi berasal dari sebuah plaintext string. Hasil tersebut harus digunakan sebagai password yang disimpan dalam ‘user’ grant table. Sedangkan fungsi encrypt(‘kata_yang_dienkripsi’,’password_pengenkripsi’) merupakan perintah enkripsi standar pada UNIX yang memanfaatkan password peng-enkripsi yang disebut ‘salt’ yang terdiri atas dua buah karakter. Selain kedua perintah enkripsi tersebut terdapat perintah lain yaitu encode (str,pass_str) yang eksekusinya mirip dengan encrypt yang memanfaatkan ‘salt’, maupun MD5(string) yang menghasilkan data hasil enkripsi sepanjang 32 digit bilangan hexa yang sebagai contoh untuk sebuah kata ‘testing’ akan menghasilkan hasil enkripsi yaitu ‘ae2b1fca515949e5d54fb22b8ed95575’. Untuk mencoba fungsi encode tersebut cobalah perintah-perintah berikut ini :
mysql> INSERT INTO user VALUES(‘adit9’, encode(‘aditya’,’test’));
Query OK, 1 row affected (0.00 sec)
mysql> INSERT INTO user VALUES(‘adit10’, encode(‘aditya’,’test’));
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * FROM user;
+——–+——————+
| name | password |
+——–+——————+
| adit3 | 28RKg.Y01Y9RE |
| adit4 | B8INV5toweKv2 |
| adit5 | a1UOXpafoUJX2 |
| adit6 | a1UOXpafoUJX2 |
| adit2 | 05bf00c242eaee8e |
| adit1 | 05bf00c242eaee8e |
| adit7 | ad2GgJP5tJDoU |
| adit8 | ad2GgJP5tJDoU |
| adit9 | $ Ô–+ |
| adit10 | $ Ô–+ |
+——–+——————+
Perhatikan bagian yang dilingkari, ternyata hasil yang diperoleh relatif sama, namun karakter yang dihasilkannya juga semakin aneh dan sukar dimengerti karena bukan karakter yang umum digunakan. Dari tabel diatas juga dapat disimpulkan bahwa untuk fungsi password, ternyata tidak memanfaatkan perbedaan huruf besar dan kecil berbeda dengan perintah encrypt, sehingga kombinasi hasil acakyang mungkin juga lebih sedikit. Selain itu pada encrypt dikenal pula karakter khusus misalnya ‘.’ dan sebagainya. Hasil enkripsi yang lebih rumit diperoleh untuk fungsi encode. Khusus untuk fungsi encode, dapat digunakan fungsi kebalikannya yaitu
decode(crypt_str,pass_str) untuk mengembalikan hasil enkripsi ke bentuk semula.

Copyright © 2002 Kampung Teknologi Publishing and Consulting

Untuk artikel ini harap menghubungi
Antonius Aditya Hartanto
Alamat : Kagakribet.com

karena beliau yang berkenaan atas tulisan ini…terima kasih sebelumnya

13 Responses

  1. mysql> INSERT INTO user values(’adit1′, password(’aditya’));
    Query OK, 1 row affected (0.00 sec)
    mysql> INSERT INTO user values(’adit2′, password(’aditya’));
    Query OK, 1 row affected (0.00 sec)
    mysql> SELECT * FROM user;

    +——-+——————+
    | name | password |
    +——-+——————+
    | adit2 | 05bf00c242eaee8e |
    | adit1 | 05bf00c242eaee8e |
    +——-+——————+

    mengapa ketika saya masukkan password(‘aditya’), hasilnya tidak sama dengan yang anda lakukan.. Hasil enkripsi saya adalah : *52B83BFB14D48D684C04299AF87E675090FA9ACB

  2. nyambung yang sebelumnya…hasil enskripsi saudara dengan fungsi password(), mungkin berlaku sebelum Mysql versi 5.0….kerana versi mysql saya sudah 5.0.67…
    untuk mendapatkan hasil enkripsi yangsama dengan yang anda lakukan,, maka pada versi 5.0.67 menggunakan fungsi OLD_PASSWORD()… jika memakai fungsi password(), hasilnya akan menjadi:
    *52B83BFB14D48D684C04299AF87E675090FA9ACB

    terima kasih

  3. Saya punya permasalahan sana Yaitu :

    SELECT * FROM table_name
    WHERE user_name = “username”
    AND password = PASSWORD(“pass”);

    dan tidak cocok hasil encrypan “pass” dengan inputan sebenarnya.
    insyaAlloh Akan saya coba dengan

    SELECT * FROM table_name
    WHERE user_name = “username”
    AND password = OLD_PASSWORD(“pass”);

    seperti yang Anda sarankan . Doain Berhasil Ya Kang

    Terimakasih.

  4. bagai mana cara Dekripsi / mengembalikan ke bentuk semula dari string yang telah di enkripsi dengan fungsi PASSWORD()

    karena saya gunakan

    SELECT * FROM field_table where pass=PASSWORD(string);

    tidak password yang cocok,padahal string sudah sama

  5. terima kasih
    ini sangat berguna untuk saya ^^

  6. Hallo Mas, aku kesulitan nih nyari tugas bwt SQL..
    Tolong dong posting juga contoh script (perintah) ma hasilnya..
    Pleaseeeee…..

  7. Kalau decrypt password gimana caranya? bis aku lupa ma Passwordnya kira2 dari gabungan karakter ini passwordnya apa ya?

    *C046FA1E16C8EB007B61B8E9A5FE6115134D80E3

  8. ketika saya insert into tbl_user values (‘1213’,encrypt(‘abd’,’cd’))

    hasil passwornya kok null ia????

  9. Bagaimana lau scrypt deskripsi password yang suah di enkripsi??

  10. kalau kita copy ke komputer lain pass nya akan berubah betul kah

  11. Makasih ya, saya mau nyoba dulu

  12. kalau boleh tahu, |179|133|90|183|136 ini enkripsi jenis apa ya? mohon penjelasannya…

  13. gan ada gk softwere untuk merubah kembali data bentuk Mysql ke wujud sebenar nya??
    misal nya ne gU{xhs>SIuz 2{E@ coba kembaliin ke data sebenar nya

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: