1. Code
  2. PHP

Teknik Sederhana untuk Mengunci Situs Web Anda

Salah satu bagian penting dari praktek pengembangan PHP selalu diingat bahwa keamanan bukanlah sesuatu yang dapat Anda beli dari rak di toko lokal Anda. Memastikan keamanan aplikasi web Anda adalah suatu proses, yang dari waktu ke waktu, perlu terus dievaluasi, dipantau, dan dikeraskan.
Scroll to top

Indonesian (Bahasa Indonesia) translation by Diangr (you can also view the original English article)

Salah satu bagian penting dari praktek pengembangan PHP selalu diingat bahwa keamanan bukanlah sesuatu yang dapat Anda beli dari rak di toko lokal Anda. Memastikan keamanan aplikasi web Anda adalah suatu proses, yang dari waktu ke waktu, perlu terus dievaluasi, dipantau, dan dikeraskan.


Pengenalan

Sementara penggunaan filter dan memvalidasi data adalah salah satu bagian dari proses keamanan, pengembang web harus menyadari bahwa Randomisasi, Obfuscation, dan Kriptografi dalam PHP dapat membuat perbedaan dalam keamanan aplikasi web. Tutorial ini akan memandu Anda melalui beberapa teknik sederhana dalam membuat dan menggunakan nilai acak atau unik dalam aplikasi web Anda, melihat dan menerapkan beberapa teknik obfuscation umum, dan melihat lebih dalam ke dalam ilmu Kriptologi dan menggunakannya dalam PHP.


Apa yang Akan Anda Pelajari

  • Cara menghasilkan nilai acak dengan PHP
  • Menghasilkan kata sandi acak
  • Salting Passwords dan Mengotentikasi Pengguna
  • Obfuscation dalam PHP, sebuah Ikhtisar
  • Kriptografi dalam PHP dan Aplikasi itu

Menghasilkan Nilai Acak

Dictionary.com mendefinisikan pengacakan sebagai:

"-verb: untuk memesan atau memilih secara acak, seperti dalam sampel atau percobaan, terutama untuk mengurangi bias dan gangguan yang disebabkan oleh variabel yang tidak relevan; membuat acak."

Generasi nomor acak ditentukan dalam berbagai cara, namun generator komputasi tidak memiliki keacakan 'benar' seperti yang terlihat di alam atau suara elektronik (saluran fuzzy, screeching, hitam dan putih di TV). Nilai-nilai yang dihitung ini dianggap sebagai pseudo-random.

PHP menyediakan kita dengan beberapa cara berbeda untuk menciptakan nilai acak. Mari kita lihat beberapa fungsi yang lebih populer.

1
2
<?php
3
rand(int $min, int $max);
4
mt_rand(int $min, int $max);
5
str_shuffle($str);
6
uniqid($prefix, more_entropy=);
7
?>

Dua fungsi rand() dan mt_rand() kemungkinan merupakan fungsi yang paling banyak digunakan untuk menghasilkan satu set angka acak dalam PHP. Fungsi rand(); adalah generator yang lebih tua, dan tidak digunakan karena mt_rand(); yang lebih cepat, lebih dapat diandalkan, dan dapat menangani nilai integer maksimum yang lebih tinggi pada beberapa platform. Fungsi str_shuffle() melakukan persis seperti yang Anda harapkan, ia mengocok string yang dilewatkan ke sana.

1
2
<?php
3
//Examples of mt_rand() usage

4
print mt_rand();//default

5
  
6
		echo "<br />";
7
	
8
print mt_rand(0, 20);//Outputs a random integer between 0 and 20

9
	
10
		echo "<br />";
11
	
12
//Examples of rand() usage

13
	
14
print rand();//default

15
	
16
		echo "<br />";
17
	
18
print rand(0, 25);//Outputs a random integer between 0 and 25

19
20
		echo "<br />";
21
	
22
//Example of str_shuffle usage

23
	
24
$string = 'abcefghijklmnopqrstuvwxyz';
25
	
26
print str_shuffle($string);//shuffles $string

27
?>

Fungsi rand() dan mt_rand() keduanya menerima dua parameter di mana $min adalah bilangan bulat terendah untuk memulai dengan, dan $max menjadi bilangan bulat terbesar untuk diakhiri. Fungsi str_shuffle mengambil satu parameter, sebuah string, menghasilkan mutasi yang diacak dari string. Kerjanya sama seperti jika Anda menyeret setumpuk kartu.

Sementara mt_rand(); akan memuntahkan bilangan bulat acak, dan str_shuffle akan mencampur string, fungsi yang banyak digunakan untuk membuat nilai unik acak adalah uniqid(). Ini menghasilkan pengenal unik prefiks berdasarkan waktu saat ini dalam mikrodetik (melalui php.net). Menggunakan fungsi ini berguna untuk membuat token sesi dan bahkan membentuk kunci seperti yang terlihat di Secure Your Forms dengan Tombol Form.

1
2
<?php
3
//Examples of uniqid() usage

4
	
5
print uniqid();//default

6
	
7
		echo "<br />";
8
	
9
print uniqid("NETTUTS", TRUE);//Adding an additional prefix and setting more_entropy to TRUE

10
?>

Fungsi uniqid() menerima dua parameter yang pertama menambahkan awalan ke hasil sementara yang kedua, jika diset ke TRUE, akan menambahkan entropy tambahan ke akhir nilai yang dikembalikan.


Menghasilkan Sandi Acak

Ada contoh trilyunan di web yang menghasilkan kata sandi acak, semua melakukan pekerjaan yang baik. "Tapi mengapa," Anda bertanya "apakah saya perlu membuat kata sandi acak?" Jawabannya, cukup sederhana, adalah sehingga Anda tidak harus bergantung pada pengguna akhir untuk memberikan diri mereka dengan kata sandi yang kurang aman pada saat memulai. Membuat kata sandi acak sangat berguna dalam pendaftaran pengguna, atau ketika pengguna mengajukan permintaan karena mereka lupa kata sandinya. Melakukan hal ini memastikan kata sandi yang kuat di awal pengalaman pengguna di situs web Anda, atau dapat memotong baris kode saat pengguna perlu mendapatkan akses lagi.

Mari kita lihat beberapa contoh: Contoh 1

1
2
<?php
3
4
//A simple function which will output a random password

5
function randompassword($count){
6
7
$pass = str_shuffle('abcefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890@#%$*');
8
9
return substr($pass,3,$count);//returns the password

10
11
}
12
?>

Contoh ini mengocok string dengan str_shuffle dan akan mengembalikan string dalam rentang yang dihitung. Jadi jika Anda ingin menghasilkan password 8 karakter maka Anda akan meneruskan 8 ke randompassword fungsi, atau randompassword (8) dari kode sumber Anda.

Contoh 2

1
2
<?php
3
4
//Another example to create a random password

5
function anorandpass($count) {
6
	
7
	$m_rand = mt_rand(); //generate a random integer

8
9
	$u_id = uniqid("MNO!@#$%^&*=+XYZ", TRUE);//create a unique identifier with some extra prefix and extra entropy

10
	
11
	$combine = $m_rand . $u_id;// Combine the variables to form a string

12
	
13
	$new = str_shuffle($combine);//shuffle our string

14
			
15
	return substr($new, 2, $count);//return the password

16
}
17
	
18
print anorandpass(8);
19
20
?>

Sebagai perbandingan, contoh seseorang mengambil string statis dan mencampurnya lalu mengembalikannya, misalnya dua menambahkan dalam rasa yang lebih dinamis (mmm lezat). Misalnya dua string yang dikocok tidak lagi statis, tetapi berubah dengan setiap generasi. Sementara contoh pertama tentu cukup dalam banyak kasus untuk menghasilkan kata sandi yang kuat, contoh kedua memungkinkan kita untuk memastikan panjang string dan karakter akan berubah dengan penggunaan, sangat mengurangi kemungkinan duplikasi.

Menegakkan penggunaan kata sandi yang kuat dalam aplikasi web akan menghalangi pengguna mengunjungi atau mendaftar untuk situs web. Ini sering merupakan trade off antara mendapatkan lalu lintas yang Anda inginkan, dan memastikan keamanan aplikasi. Saya sarankan mengizinkan pengguna Anda untuk membuat kata sandi sendiri saat mendaftar, atau memungkinkan mereka untuk memilih di antara keduanya.


Tolong Lulus Garam. Salting Passwords untuk Peningkatan Keamanan.

Salting password adalah cara yang efektif untuk meningkatkan keamanan akun pengguna Anda bahkan jika penyerang mendapatkan akses ke database Anda, jika dilakukan dengan benar. Dapat dikatakan bahwa, dengan akses ke garam, penyerang masih dapat memperoleh kredensial Anda. Meskipun ini benar, menerapkan beberapa teknik pengacakan ke penyimpanan kata sandi akan membuat proses itu sangat sulit, terutama jika penyimpanan informasi pengguna dan konten dibagi menjadi database terpisah.


Kenapa dan bagaimana?

Sekali lagi ini jatuh di bawah "non-ketergantungan pengguna akhir untuk memberikan diri mereka sendiri keamanan sederhana" ukuran. Pengguna biasanya menggunakan kata sandi yang mudah diingat, dan bahkan menggunakan kata sandi yang sama di beberapa situs web (saya tahu, kan !?). Kata sandi yang mudah diingat biasanya kata-kata yang ditemukan dalam kamus dan jenis nilai lainnya (misalnya 12345, QWERTY). Sebagai pengembang, kami sering kali mencemooh praktik ini, tetapi kami tidak dapat menyangkal bahwa ini memang seperti apa adanya.

Agar aplikasi web menggunakan garam dalam kata sandi, aplikasi harus menyimpannya di suatu tempat. Tidak disarankan untuk menggunakan garam yang sama di seluruh basis data kata sandi, tetapi untuk menghasilkan garam unik per pengguna. Menghasilkan satu garam untuk seluruh database sebenarnya mengurangi keamanan aplikasi web dalam arti bahwa jika penyerang berhasil memecahkannya seluruh skema rusak, atau jika hilang, menjadikan database tidak berguna. Membuat sistem pendaftaran anggota lengkap dengan semua lonceng dan peluit berada di luar cakupan tutorial ini, namun kami akan membuat sistem sederhana untuk menggunakan contoh. Mari kita lihat menghasilkan garam dan menerapkan beberapa teknik pengacakan:


1. koneksi Database

Berikut adalah tabel SQL yang akan kita gunakan.

1
2
CREATE TABLE IF NOT EXISTS `users` (
3
  `usr_id` int(11) NOT NULL AUTO_INCREMENT,
4
  `usr_name` varchar(24) NOT NULL,
5
  `usr_pass` varchar(32) NOT NULL,
6
  `usr_email` varchar(255) NOT NULL,
7
  `usr_salt` varchar(255) NOT NULL,
8
  PRIMARY KEY (`usr_id`)
9
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 ;
1
2
<?php
3
/*db_config.php*/
4
5
//database configuration

6
$db_host ="localhost" ; //will likely stay the same

7
$db_name = "thedbname"; //the name of the database table

8
$db_usr = "username"; //your database username

9
$db_pass = "password";//your database password

10
11
//Establish a connection with MySQL and select the database to use

12
mysql_connect($db_host, $db_usr, $db_pass) or die("MySQL Error: " . mysql_error());
13
mysql_select_db($db_name) or die("MySQL Error: " . mysql_error());
14
?>

2. File Pendaftaran

1
2
<?php
3
/*registration.php*/
4
5
//require our db_config.php file

6
require ('db_config.php');
7
8
//Check to see if the form has been submitted

9
if(!empty($_POST['username'])  && !empty($_POST['email']) && !empty($_POST['password'])) {
10
	
11
    //Escape our posted inputs

12
	$username = mysql_real_escape_string($_POST['username']);
13
	$email = mysql_real_escape_string($_POST['email']);
14
	$password = mysql_real_escape_string($_POST['password']);
15
	
16
    //generate a strong unique salt

17
	$salt_gen = uniqid(mt_rand());
18
	
19
    //Combine email, the password and the salt together

20
	$combine = $email . $password . $salt_gen;
21
	
22
    //md5 hash the combined password * Note: md5 is only used in this scenario as an example

23
	$newpassword = md5($combine);
24
	
25
    //insert the values into the database

26
	$registerquery = mysql_query("INSERT INTO users (usr_name, usr_pass, usr_email,  usr_salt) VALUES ('".$username."', '".$newpassword."', '".$email."', '".$salt_gen."')") or die("MySQL Error: ".mysql_error());
27
	
28
    //let the user know of success or failure

29
	if ($registerquery) {
30
		echo '<h1>Success</h1>';
31
	} else {
32
		echo '<h1>Failure</h1>';
33
	}
34
}
35
?>

Mari kita bahas kode PHP. Untuk menjaga hal-hal sederhana, kami menyertakan file konfigurasi database kami. Selanjutnya PHP memeriksa untuk melihat apakah formulir HTML telah dikirimkan dengan memeriksa apakah variabel $_POST tidak kosong. Jika mereka tidak kosong maka skrip hasil untuk melarikan diri dari data formulir yang diposting dari pengguna, mempersiapkannya untuk dimasukkan ke dalam database. Kami kemudian menghasilkan garam sederhana menggunakan uniqid() dan mt_rand() dan menyimpannya dalam variabel $salt_gen. Untuk mengaramkan kata sandi kami, kami menggabungkan kata $sandi, lalu garam. Langkah selanjutnya, salah satu cara hashing variabel gabungan dengan md5.

"Tapi tunggu! Kamu juga menambahkan email pengguna ke depan kata sandi dan kombo garam!" Ya! Saya melakukan ini karena, jika penyerang mendapatkan akses ke database saya dalam beberapa cara, dan garam, satu-satunya cara penyerang akan tahu pasti bahwa alamat email yang digunakan dalam hashing dari kata sandi adalah jika mereka memiliki akses ke kode sumber. Seberapa acak dan uniknya alamat email?

Untuk melengkapi sisa kode PHP, kita masukkan variabel-variabel kita ke dalam tabel database di dalam bidangnya masing-masing, dan memberi pengguna beberapa umpan balik tentang keberhasilan atau kegagalan. Sekarang ke sisa file registrasi, HTML

1
2
<!DOCTYPE html>
3
<html>
4
5
<head>
6
7
</head>
8
9
<body>
10
11
<form action="" method="post">
12
	<label for="username">Enter a Username</label>
13
    <input type="text" name="username" /><br />
14
    
15
    <label for="email">Enter your Email</label>
16
    <input type="text" name="email" /><br />
17
    
18
    <label for="password">Enter a Password</label>
19
    <input type="password" name="password" /><br />
20
    
21
    <input type="submit" name="submit" value="Submit" />
22
</form>
23
24
</body>
25
26
</html>

Di sini kami membuat formulir HTML sederhana yang akan mengumpulkan nama pengguna, email, dan kata sandi  dari pengguna. Tidak ada yang mewah di sini.


3. Mengotentikasi Pengguna

Jadi sekarang kami memiliki formulir pendaftaran sederhana, yang memasukkan pengguna ke dalam database bersama dengan kata sandi asin mereka. Mari buat halaman login yang akan mengharuskan kita untuk mengambil informasi dari database dan mengotentikasi pengguna. Pertama PHP:

1
2
<?php
3
/*login.php*/
4
5
//require our db_config.php file

6
require ('db_config.php');
7
8
//Check to see if the form has been submitted

9
if(!empty($_POST['username'])  && !empty($_POST['password'])) {
10
	
11
	//Escape our posted inputs 

12
	$username = mysql_real_escape_string($_POST['username']);		
13
	$password = mysql_real_escape_string($_POST['password']);
14
	
15
	//Grab the row associated with the username from the form

16
	$grab_row = mysql_query("SELECT * FROM users WHERE usr_name = '".$username."'") or die ("MySQL Error: ".mysql_error());
17
	
18
	//If only one row was retrieved

19
	if (mysql_num_rows($grab_row) == 1) {
20
		
21
		//create an array from the row fields

22
		$row = mysql_fetch_array($grab_row);
23
		
24
		//store the users salt in a var

25
		$salt = $row['usr_salt'];
26
		
27
		//store the users email in a var

28
		$email = $row['usr_email'];
29
		
30
		//recombine the variables email, password, and the salt

31
		$combine = $email . $password . $salt;
32
		
33
		//re-hash the combined variables Note:md5 is only used in this scenario as an example

34
		$auth_pass = md5($combine);
35
		
36
		//check the database again for the row associated with the username and the rehashed password

37
		$checklogin = mysql_query("SELECT * FROM users WHERE usr_name = '".$username."' AND usr_pass = '".$auth_pass."'") or die("MySQL Error: ".mysql_error());
38
		
39
		//if only one row is retrieved output success or failure to the user

40
		if(mysql_num_rows($checklogin) == 1) {
41
			echo '<h1>Yippie, we are authenticated!</h1>';
42
		} else {
43
			echo '<h1>Oh no, we are not authenticated!</h1>';
44
		}
45
	} else {
46
		echo '<h1>Oh no, we are not in the database!</h1>';
47
	}
48
}
49
?>

Pada dasarnya apa yang kita lakukan di file login.php adalah mengambil variabel formulir yang diajukan,  meraih baris tabel yang terkait dengan nama pengguna dan membangun kembali kata sandi dari elemen-elemen dalam database yang dibuat dengan (email, pass, salt) dan mengulanginya kembali . Kami kemudian memeriksa kembali  database untuk nama pengguna DAN nilai kata kunci rehashed untuk menemukan kecocokan, menghasilkan pengguna pada keberhasilan atau kegagalan. Akhirnya di sini adalah HTML:

1
2
<!DOCTYPE html>
3
<html>
4
<head>
5
6
</head>
7
8
<body>
9
<form action="" method="post">
10
	<label for="username">Enter your Username</label>
11
    <input type="text" name="username" /><br />
12
     
13
    <label for="password">Enter a Password<label>
14
    <input type="password" name="password" /><br />
15
    
16
    <input type="submit" name="submit" value="Submit" />
17
</form>
18
</body>
19
</html>

Obfuscation dalam PHP

Definisi obfuskasi yang sederhana namun kompleks adalah (gunakan versi yang terdapat dalam sumber jika Anda ingin menjalankan kode):

1
2
<?php $a1c0_z2='c'.$a91.'tion ';$a91="a";$vly_ti="us".'ed';$j1h_32_a=' to';$z1b_1=$a91." ";$lz32i_4="“O"."bfus";$g1k0p='que ';$lv83="t".'ec'.'hni';$lFa='i'.'s ';if($z1b_1==$a91." ")$rx_b_1='a';$glccUv=" complic".$rx_b_1.'te ';$xl1ttf='code ';$zljal1="in such a";if($z1b_1==$a91." ")$s1b_1='a';$p1x2 =" w".$s1b_1."y ";$il_7x=' '.$b1zE_.'t i'.$l1yes;$b1zE_="i";$l1yes="s";$nltotry_ws='st'.$s1b_1."n";$yl5B_='thαt ';$dlno=' not ';$m1tomanythings="under";if($s1b_1=='a')$bz_1=$s1b_1;$Ozaq="d".$bz_1."ble"";echo base64_decode("JiM4MjIwO09iZnVzY3Rpb24mIzgyMDE7aXMmIzgyMDE7YSYjODIwMTt0ZWNobmlxdWUmIzgyMDE7dXNlZCYjODIwMTt0byYjODIwMWNvbXBsaWNhdGUmIzgyMDE7Y29kZSYjODIwMTtpbiYjODIwMTtzdWNoJiM4MjAxO2EmIzgyMDE7d2F5JiM4MjAxO3RoJmFscGhhO3QmIzgyMDE7aSYjODIwMTt0JiM4MjAxO2kmIzgyMDE7bm90JiM4MjAxO3VuZGVyc3RhbmRhYmxlJnF1b3Q7");?>

Seperti yang Anda lihat, kode ini tidak dapat dibedakan. Tidak ada nama variabel yang berbeda, tidak ada komentar, tidak ada spasi, tidak ada indentasi, tidak ada urutan yang jelas dan semuanya dalam satu baris. Meskipun kami tidak dapat membatalkan kode, mesin kami masih tahu apa itu. Berhasil. Satu baris kekacauan ini hanyalah gema "Obfusction adalah teknik yang digunakan untuk memperumit kode sedemikian rupa sehingga saya tidak dapat dimengerti." Ya, saya tahu tentang kesalahannya.

Obfuscation memiliki pro dan kontra. Tujuannya adalah untuk membujuk seseorang agar tidak mengetahui apa yang dilakukan kode secara sekilas, atau untuk jangka waktu tertentu. Ini adalah nilai tambah terhadap individu dengan sedikit atau tanpa pengetahuan bahasa pemrograman. Namun, siapa pun yang memiliki pemahaman dasar tentang PHP dapat menyebarluaskan kode yang dikaburkan di atas dan mencari tahu apa yang dilakukannya, mungkin hanya butuh sedikit waktu. Ini adalah salah satu kekurangan dari obfuscation, itu bukan bentuk enkripsi, itu hanya upaya untuk menjadi samar. Obfuscation juga biasanya menambah file. Banyak waktu, Anda akan menemukan kode yang dikaburkan dalam perangkat lunak ropriatary dan jahat.


Jadi, Bagaimana Saya Bisa Mengaburkan Kode Saya?

Ini adalah pertanyaan umum. Ada dua cara utama untuk mengaburkan kode Anda. Pertama, Anda bisa melakukannya dengan tangan. Menulis kode yang dikaburkan membutuhkan waktu yang lama. Contoh yang digunakan dalam artikel ini membutuhkan beberapa saat untuk menulis karena alasan yang sama Anda menggunakan obfuscation di tempat pertama (kurangnya struktur, pesanan dll ...), ini bahkan menghasilkan beberapa kesalahan kasar yang saya bahkan tidak ingin berburu dan perbaiki. Cara kedua Anda dapat mengaburkan kode Anda adalah dengan membeli perangkat lunak yang melakukannya untuk Anda. Menggunakan program untuk mengaburkan kode adalah hal yang sepele, dan tentu saja menghabiskan banyak uang waktu. Beberapa perangkat lunak yang mengklaim mengaburkan kode Anda, sebenarnya mengenkripsi dan / atau menyandikannya sedemikian rupa sehingga bergantung pada handshake berfungsi. Seringkali Anda akan menemukan  perangkat lunak yang vendornya bahkan tidak menjamin kode Anda akan berfungsi saat itu selesai. Bahkan dalam contoh, saya menggunakan fungsi Base64 sederhana untuk menyandikan konstruksi output skrip.


Beberapa Tip Obfuscation

  • Selalu, selalu, jagalah versi bersih dari sumber untuk diri Anda sendiri.
  • Semakin acak teknik Anda, semakin baik.
  • Hilangkan semua spasi putih, di mana tidak diperlukan.
  • Karakter Encode dicetak/echo'ed karakter dan spasi (yaitu kutipan, ruang tipis, apostropes, hypens)
  • Semakin rumit kodenya, semakin baik.
  • Abaikan struktur kecuali itu merugikan pengoperasian kode (e.x. Lokasi variabel sebelum mereka dipanggil)
  • Jangan gunakan nama variabel, ruang nama, atau nama kelas yang dapat dibedakan.
  • Semakin sedikit kode yang Anda gunakan kembali, semakin baik
  • Jangan percaya itu sangat mudah

Untuk Mengaburkan atau Tidak Mengaburkan?

Itu benar-benar tergantung pada rencanamu. Khususnya jika Anda ingin menjual skrip PHP Anda (atau perangkat lunak apa pun), Anda harus melisensikannya. Ini akan menjadi salah satu pertahanan garis depan untuk menggagalkan perangkat lunak yang dimaksudkan pemirsa dari melakukan apa pun yang mereka inginkan. Contoh utama pemberian lisensi dapat dilihat di Wiki Envato Marketplace. Namun, Anda mungkin ingin mengaburkan sebagian atau semua kode Anda karena alasan apa pun. Akan tetapi karena obfuscations negatif, jika Anda benar-benar khawatir tentang keamanan kode sumber Anda, mungkin sebaiknya mencari enkripsi sebagai  gantinya.


Kriptografi di PHP

Wikipedia.com mendefinisikan kriptografi sebagai:

"latihan dan belajar menyembunyikan informasi."

Kriptografi adalah masalah besar, apakah Anda menyadarinya atau tidak. Di hampir setiap aplikasi web yang saat ini digunakan, ada beberapa keberadaan kriptografi yang digunakan (yaitu klien dan situs web mail). Sebagai pengembang kita perlu menjadi terinformasi dan sadar tentang aplikasi praktis kriptografi dalam perangkat lunak kami. PHP menyediakan kami dengan beberapa fungsi yang sangat dasar dan praktis yang kita dapat menggunakan untuk mengenkripsi data. Dalam bagian ini, terutama akan lebih dari sekali jalan hashing algoritma meskipun saya akan menyentuh ringan pada enkripsi simetris-key berbasis. Ada lebih banyak (yaitu Steganografi, Asymmetric-kunci untuk nama beberapa).


Salah satu cara Hash

Banyak waktu kita memanfaatkan hashing sekali jalan sebagai cara untuk aman menyimpan password dan memeriksa integritas data file. Sementara kita melakukan ini, untuk mengotentikasi anggota web aplikasi yang kami hash pengguna memasukkan sandi, dan cocok terhadap hash pengguna disimpan. Teknik yang sama berlaku untuk memeriksa integritas file.

SHA-1, 2, dan 3

Keluarga algoritma hash SHA yang saat ini yang paling populer, secara signifikan SHA-1. Meskipun SHA-1 algoritma mungkin memiliki kelemahan, ianya masih digunakan secara luas.

1
2
<?php
3
4
///One way hashing with SHA-1

5
6
$string = "Netuts is Awesome";
7
8
$hash = sha1($string);
9
//or

10
$hash2 = hash('sha1', $string);
11
12
echo $hash."<br />";
13
echo $hash2."<br /><br />";
14
15
//Will output: 42d2f15c3f92d28d7d58776e5d81b800f662cc6c 

16
?>

Dalam PHP, SHA-2 dipanggil dalam hal berbeda, dan memerlukan PHP 5 lebih besar dari atau sama dengan 5.1.2. SHA-2 lebih unggul dari SHA-1 dan dapat disebut dengan ukuran berbeda sedikit.

1
2
<?php
3
$string_sha256 = "Nettuts is Awesome";
4
$string_sha384 = "Nettuts is Awesome";
5
$string_sha512 = "Nettuts is Awesome";
6
7
$hash_sha256 = hash('sha256', $string_sha256);
8
$hash_sha384 = hash('sha384', $string_sha384);
9
$hash_sha512 = hash('sha512', $string_sha512);
10
11
echo $hash_sha256."<br />";
12
echo $hash_sha384."<br />";
13
echo $hash_sha512."<br />";
14
15
/* Outputs repspectively:

16
sha256 : 09074adc0d70e15b88494643e29c2836e1ab94a21989691dec594cb0bd742ebc

17
sha384 : 8535470750df54a78701d4bfe0451f9799057a5bc101944a32480d2436e8b95440bce3bcab3f9ce107b0b92d9595ae32

18
sha512 : c2e6dce873a71800b862791e56b480b976bb26cd3136c02da510c3905caa49b7b9e9260549976e1e741cc93e4569a611f2030d3b7104c6c6c2ff9e6c9bf0946a

19
*/
20
21
?>

Fungsi hash yang disebut hash (algoritma, string); Dalam versi PHP terbaru fungsi hash() dapat digunakan untuk memanggil setiap sekali jalan hash algoritma PHP mendukung (yaitu md5, sha-1, Renault, hantu). Jika Anda ingin melihat daftar semua hashing algoritma terdaftar Anda dapat menggunakan:

1
2
<?php
3
//As of PHP5 >= 5.1.2

4
print_r(hash_algos());
5
?>

SHA-3 adalah masih sedang dikembangkan dan dipertimbangkan untuk standardisasi. Sebuah kompetisi untuk menemukan seorang calon yang baik untuk bertindak sebagai baru aman algoritma hash diluncurkan oleh Institut Nasional standar dan teknologi dan entri untuk kompetisi yang deadlined untuk 31 Oktober 2008. Sebuah catatan yang lebih populer bernama gulungan, memiliki modul PHP Anda dapat men-download (meskipun Anda perlu compile sendiri). Gulungan dikembangkan oleh beberapa nama besar yang ditemukan dalam industri keamanan seperti Bruce Schneier, Niels Ferguson dan Stefan Lucks untuk beberapa nama. Gulungan website resmi dapat ditemukan di sini.


Berbasis kunci enkripsi

Metode enkripsi simetris-Key adalah dimana keamanan enkripsi terutama berada di dalam sebuah kunci, yang dibagi antara dua titik, dimana data dienkripsi dan data adalah terdekrip. Contoh yang sangat baik bagaimana ini bisa bekerja diberikan oleh Christian Beikov "Menciptakan Crypter kelas dengan PHP" tutorial.


HMAC

HMAC pada dasarnya adalah seperti campuran antara sekali jalan hashing dan enkripsi berbasis kunci. HMAC keamanan bergantung pada ukuran kunci yang digunakan, dan kekuatan fungsi hash dengan dihitung.Anda dapat membandingkan metode ini dengan menggaram password.

1
2
<?php
3
$string_hmac = "Nettuts is Awesome";
4
5
//hash_hmac(algorithm, string to hash, key)

6
$hmac = hash_hmac('sha1', $string_hmac, 'secret');
7
8
echo $hmac."<br />";
9
?>

Membungkus semuanya

Wah apa perjalanannya! Mengacak nilai, menghasilkan kata sandi acak, pengasinan, menyimpan dan mengautentikasi pengguna, kebingungan, crypto ... sepertinya membutuhkan banyak hal. Tapi setimpal! Penting untuk mengetahui jenis keamanan apa yang akan Anda terapkan ke dalam aplikasi web Anda, dan bagaimana Anda akan melindunginya. Terlebih lagi, penting untuk menjaga sikap cerdas terhadap implementasi ini dan tidak berpikir bahwa keamanan hanya diimplementasikan oleh beberapa metode, tetapi dengan kombinasi dari mereka, dengan sedikit kreativitas.