Perbedaan mendasar antara algoritma Hashing dan Enkripsi

509

Saya melihat banyak kebingungan antara hash dan algoritma enkripsi dan saya ingin mendengar beberapa saran ahli tentang:

  1. Kapan harus menggunakan hash vs enkripsi

  2. Apa yang membuat algoritma hash atau enkripsi berbeda (dari tingkat teoretis / matematis) yaitu apa yang membuat hash tidak dapat dibatalkan (tanpa bantuan pohon pelangi)

Berikut adalah beberapa Pertanyaan SO yang serupa yang tidak terlalu detail seperti yang saya cari:

Apa perbedaan antara Kebingungan, Hashing, dan Enkripsi?
Perbedaan antara enkripsi dan hashing

Kenny Cason
sumber
28
Saya bisa meramalkan ini menjadi yang pertanyaan untuk merujuk orang ketika mereka bingung istilah. :)
Adam Paynter
18
hashing adalah satu cara (tidak dapat dikembalikan), enkripsi adalah dua arah (dapat didekripsi)
bestsss
Hash juga berguna untuk mengindeks struktur dan objek besar, misalnya file. Lihat tabel hash .
HABO
22
Hashing seperti penggiling daging. Anda dapat mengubah sapi menjadi hamburger, tetapi tidak sebaliknya.
Neil McGuigan
Saya perhatikan pertanyaan saya telah diedit. Saya selalu tahu perbedaan tingkat atas antara keduanya tetapi lebih ingin tahu tentang perbedaan tingkat rendah / matematika. :) Bagaimanapun, banyak konten bagus untuk SO! Terimakasih banyak!
Kenny Cason

Jawaban:

738

Anda bisa mencarinya di Wikipedia ... Tapi karena Anda ingin penjelasan, saya akan melakukan yang terbaik di sini:

Fungsi Hash

Mereka menyediakan pemetaan antara input panjang arbitrer, dan output (biasanya) panjang tetap (atau lebih kecil). Ini bisa berupa apa saja, dari crc32 sederhana, hingga fungsi hash kriptografis yang penuh sesak nafas seperti MD5 atau SHA1 / 2/256/512. Intinya adalah bahwa ada pemetaan satu arah yang terjadi. Selalu ada banyak: 1 pemetaan (berarti akan selalu ada tabrakan) karena setiap fungsi menghasilkan output yang lebih kecil daripada yang bisa dimasukkan (Jika Anda memasukkan setiap file 1mb ke MD5, Anda akan mendapatkan banyak tabrakan).

Alasan mereka sulit (atau tidak mungkin secara praktis) untuk dibalik adalah karena cara mereka bekerja secara internal. Sebagian besar fungsi hash kriptografis beralih pada input yang ditetapkan berkali-kali untuk menghasilkan output. Jadi jika kita melihat pada setiap panjang input yang tetap (yang bergantung pada algoritma), fungsi hash akan memanggil keadaan saat ini. Ini kemudian akan beralih ke negara dan mengubahnya ke yang baru dan menggunakannya sebagai umpan balik ke dirinya sendiri (MD5 melakukan ini 64 kali untuk setiap sepotong data 512bit). Itu kemudian entah bagaimana menggabungkan status yang dihasilkan dari semua iterasi ini kembali bersama untuk membentuk hash yang dihasilkan.

Sekarang, jika Anda ingin men-decode hash, pertama-tama Anda harus mencari cara untuk membagi hash yang diberikan menjadi status iterasi (1 kemungkinan input lebih kecil dari ukuran sepotong data, banyak untuk input lebih besar). Maka Anda harus membalikkan iterasi untuk setiap negara. Sekarang, untuk menjelaskan mengapa ini adalah sangat sulit, bayangkan mencoba untuk menyimpulkan adan bdari rumus berikut: 10 = a + b. Ada 10 kombinasi positif adan byang dapat bekerja. Sekarang lewati beberapa kali:tmp = a + b; a = b; b = tmp. Untuk 64 iterasi, Anda akan memiliki lebih dari 10 ^ 64 kemungkinan untuk dicoba. Dan itu hanya tambahan sederhana di mana beberapa negara dipertahankan dari iterasi ke iterasi. Fungsi hash nyata melakukan lebih dari 1 operasi (MD5 melakukan sekitar 15 operasi pada 4 variabel keadaan). Dan karena iterasi berikutnya tergantung pada keadaan sebelumnya dan sebelumnya dihancurkan dalam menciptakan kondisi saat ini, itu semua tidak mungkin untuk menentukan keadaan input yang mengarah ke status output yang diberikan (untuk setiap iterasi tidak kurang). Gabungkan bahwa, dengan sejumlah besar kemungkinan yang terlibat, dan memecahkan kode bahkan MD5 akan mengambil jumlah sumber daya yang hampir tak terbatas (tetapi bukan tak terbatas). Begitu banyak sumber daya sehingga

Fungsi Enkripsi

Mereka menyediakan pemetaan 1: 1 antara input dan output panjang yang sewenang-wenang. Dan mereka selalu bisa dibalik. Yang penting untuk dicatat adalah itu dapat dibalik menggunakan beberapa metode. Dan selalu 1: 1 untuk kunci yang diberikan. Sekarang, ada beberapa input: pasangan kunci yang mungkin menghasilkan output yang sama (sebenarnya biasanya ada, tergantung pada fungsi enkripsi). Data terenkripsi yang baik tidak bisa dibedakan dari kebisingan acak. Ini berbeda dari output hash yang baik yang selalu dari format yang konsisten.

Gunakan Kasing

Gunakan fungsi hash ketika Anda ingin membandingkan nilai tetapi tidak dapat menyimpan representasi polos (karena sejumlah alasan). Kata sandi harus sesuai dengan kasus penggunaan ini dengan sangat baik karena Anda tidak ingin menyimpannya teks biasa untuk alasan keamanan (dan tidak seharusnya). Tetapi bagaimana jika Anda ingin memeriksa filesystem untuk file musik bajakan? Tidak praktis menyimpan 3 mb per file musik. Jadi alih-alih, ambil hash file tersebut, dan simpan itu (md5 akan menyimpan 16 byte, bukan 3mb). Dengan begitu, Anda hanya meng-hash setiap file dan membandingkannya dengan database hash yang tersimpan (Ini tidak berfungsi dengan baik dalam praktik karena pengodean ulang, pengubahan header file, dll, tetapi ini merupakan contoh kasus penggunaan).

Gunakan fungsi hash saat Anda memeriksa validitas data input. Untuk itulah mereka dirancang. Jika Anda memiliki 2 buah input, dan ingin memeriksa apakah keduanya sama, jalankan keduanya melalui fungsi hash. Probabilitas tabrakan secara astronomis rendah untuk ukuran input kecil (dengan asumsi fungsi hash yang baik). Karena itu disarankan untuk kata sandi. Untuk kata sandi hingga 32 karakter, md5 memiliki ruang keluaran 4 kali lipat. SHA1 memiliki 6 kali ruang output (kurang-lebih). SHA512 memiliki sekitar 16 kali ruang output. Anda tidak terlalu peduli apa kata sandi itu , Anda peduli apakah itu sama yang disimpan. Itu sebabnya Anda harus menggunakan hash untuk kata sandi.

Gunakan enkripsi kapan pun Anda perlu mendapatkan kembali data input. Perhatikan kata kebutuhan . Jika Anda menyimpan nomor kartu kredit, Anda harus mengembalikannya di beberapa titik, tetapi tidak ingin menyimpannya dalam bentuk teks. Jadi alih-alih, simpan versi terenkripsi dan simpan kunci seaman mungkin.

Fungsi hash juga bagus untuk menandatangani data. Misalnya, jika Anda menggunakan HMAC, Anda menandatangani sepotong data dengan mengambil hash data yang digabungkan dengan nilai yang diketahui tetapi tidak ditransmisikan (nilai rahasia). Jadi, Anda mengirim teks biasa dan hash HMAC. Kemudian, penerima hanya hash data yang dikirimkan dengan nilai yang diketahui dan memeriksa untuk melihat apakah cocok dengan HMAC yang dikirimkan. Jika itu sama, Anda tahu itu tidak dirusak oleh pesta tanpa nilai rahasia. Ini biasanya digunakan dalam sistem cookie aman oleh kerangka kerja HTTP, serta dalam pengiriman pesan data melalui HTTP di mana Anda menginginkan jaminan integritas dalam data.

Catatan tentang hash untuk kata sandi:

Fitur utama dari fungsi hash kriptografi adalah bahwa mereka harus sangat cepat untuk dibuat, dan sangat sulit / lambat untuk dibalik (begitu banyak sehingga secara praktis tidak mungkin). Ini menimbulkan masalah dengan kata sandi. Jika Anda menyimpan sha512(password), Anda tidak melakukan apa pun untuk menjaga dari meja pelangi atau serangan brute force. Ingat, fungsi hash dirancang untuk kecepatan. Jadi sepele bagi penyerang untuk hanya menjalankan kamus melalui fungsi hash dan menguji setiap hasil.

Menambahkan garam membantu masalah karena menambahkan sedikit data yang tidak diketahui ke hash. Jadi, alih-alih menemukan apa pun yang cocok md5(foo), mereka perlu menemukan sesuatu yang ketika ditambahkan ke garam yang dikenal menghasilkan md5(foo.salt)(yang sangat sulit dilakukan). Tapi itu masih tidak menyelesaikan masalah kecepatan karena jika mereka tahu garam itu hanya masalah menjalankan kamus.

Jadi, ada cara untuk mengatasi ini. Salah satu metode populer disebut penguatan kunci (atau peregangan kunci). Pada dasarnya, Anda mengulangi hash berkali-kali (biasanya ribuan). Ini melakukan dua hal. Pertama, memperlambat runtime dari algoritma hashing secara signifikan. Kedua, jika diimplementasikan dengan benar (mengirimkan input dan garam kembali pada setiap iterasi) sebenarnya meningkatkan entropi (ruang yang tersedia) untuk output, mengurangi kemungkinan tabrakan. Implementasi sepele adalah:

var hash = password + salt;
for (var i = 0; i < 5000; i++) {
    hash = sha512(hash + password + salt);
}

Ada implementasi lain yang lebih standar seperti PBKDF2 , BCrypt . Tetapi teknik ini digunakan oleh beberapa sistem terkait keamanan (seperti PGP, WPA, Apache dan OpenSSL).

Intinya, hash(password)tidak cukup baik. hash(password + salt)lebih baik, tetapi masih belum cukup baik ... Gunakan mekanisme hash yang diregangkan untuk menghasilkan hash kata sandi Anda ...

Catatan lain tentang peregangan sepele

Jangan dalam keadaan apa pun memberi makan output dari satu hash langsung kembali ke fungsi hash :

hash = sha512(password + salt); 
for (i = 0; i < 1000; i++) {
    hash = sha512(hash); // <-- Do NOT do this!
}

Alasannya ada hubungannya dengan tabrakan. Ingat bahwa semua fungsi hash memiliki tabrakan karena ruang output yang mungkin (jumlah kemungkinan output) lebih kecil daripada ruang input. Untuk melihat alasannya, mari kita lihat apa yang terjadi. Untuk mengawali ini, mari kita asumsikan ada kemungkinan 0,001% tabrakan sha1()(ini jauh lebih rendah pada kenyataannya, tetapi untuk tujuan demonstrasi).

hash1 = sha1(password + salt);

Sekarang, hash1memiliki kemungkinan tabrakan 0,001%. Tetapi ketika kita melakukan selanjutnya hash2 = sha1(hash1);, semua tabrakan hash1secara otomatis menjadi tabrakanhash2 . Jadi sekarang, kami memiliki tingkat hash1 di 0,001%, dan sha1()panggilan ke-2 menambah itu. Jadi sekarang, hash2memiliki kemungkinan tabrakan 0,002%. Peluang itu dua kali lipat! Setiap iterasi akan menambah 0.001%kemungkinan tabrakan dengan hasilnya. Jadi, dengan 1000 iterasi, peluang tabrakan melonjak dari sepele 0,001% menjadi 1%. Sekarang, degradasi adalah linear, dan probabilitas sebenarnya jauh lebih kecil, tetapi efeknya sama (perkiraan kemungkinan tabrakan tunggal md5adalah sekitar 1 / (2 128 ) atau 1 / (3x10 38). Meskipun itu tampak kecil, berkat serangan ulang tahun itu tidak benar-benar sekecil kelihatannya).

Alih-alih, dengan menambahkan kembali garam dan kata sandi setiap kali, Anda memasukkan kembali data ke fungsi hash. Jadi setiap tabrakan dari babak tertentu tidak lagi tabrakan dari babak berikutnya. Begitu:

hash = sha512(password + salt);
for (i = 0; i < 1000; i++) {
    hash = sha512(hash + password + salt);
}

Memiliki kemungkinan tabrakan yang sama dengan sha512fungsi asli . Yang kamu inginkan. Gunakan itu sebagai gantinya.

ircmaxell
sumber
30
Sayang sekali programmer di LinkedIn tidak membaca ini sebelum mereka menyimpan kata sandi sebagai hash SHA1 tawar ... money.cnn.com/2012/06/06/technology/linkedin-password-hack/…
Eric J.
2
@ Peracerier: itu memberikan sedikit penekanan pada hashing juga. Ini masuk ke detail khusus pada hashing kata sandi ...
ircmaxell
1
Saya tidak mengerti bagaimana bisa pemetaan 1 banding 1 jika ada beberapa kunci yang menghasilkan output yang sama. Untuk DES, panjang kuncinya adalah 56 bit dan ukuran blok adalah 64 bit. Karenanya, bukankah ada 256 kunci berbeda yang dapat memetakan ke blok output yang sama?
mrQWERTY
1
@ Renren29 ya. Anda benar. Dalam praktiknya, seluruh sandi tidak bersifat surjektif atau suntik. Namun, untuk kunci yang diberikan, ini bersifat surjektif (setiap teks biasa memiliki tepat satu ciphertext) tetapi tidak harus injeksi (tidak setiap ciphertext yang mungkin memiliki pemetaan kembali). Itu sebabnya saya katakan selalu 1: 1 untuk kunci yang diberikan . Jika tidak ada beberapa kunci yang bisa di-output ke blok output yang sama, maka cipher tidak akan berguna karena ciphertext akan memberi tahu Anda sesuatu tentang kunci tersebut (tanpa menyadarinya).
ircmaxell
7
Jawaban yang bagus Nitpick saya satu-satunya adalah bahwa degradasi peregangan sepele tidak bisa linier atau akhirnya akan melewati 100%. Saya pikir dalam contoh Anda dengan 0,001% langkah kedua harus 0,001 + (1 - 0,001) * 0,001, atau 0,001999.
AlexDev
160

Fungsi hash dapat dianggap sama dengan memanggang sepotong roti. Anda mulai dengan input (tepung, air, ragi, dll ...) dan setelah menerapkan fungsi hash (mencampur + membuat kue), Anda berakhir dengan output: sepotong roti.

Cara lain sangat sulit - Anda tidak dapat benar-benar memisahkan roti menjadi tepung, air, ragi - beberapa di antaranya hilang selama proses pemanggangan, dan Anda tidak pernah tahu persis berapa banyak air atau tepung atau ragi yang digunakan untuk roti tertentu, karena informasi itu dihancurkan oleh fungsi hashing (alias oven).

Banyak varian input yang berbeda secara teoritis akan menghasilkan roti identik (mis. 2 gelas air dan 1 tsbp ragi menghasilkan roti yang persis sama dengan 2,1 gelas air dan 0,9 btbp ragi), tetapi dengan salah satu roti itu, Anda tidak bisa mengatakannya. persis apa kombo input yang menghasilkannya.

Enkripsi, di sisi lain, dapat dilihat sebagai brankas. Apa pun yang Anda letakkan di sana keluar kembali, asalkan Anda memiliki kunci yang terkunci di tempat pertama. Ini operasi simetris. Diberikan kunci dan beberapa input, Anda mendapatkan output tertentu. Mengingat output itu, dan kunci yang sama, Anda akan mendapatkan kembali input asli. Ini pemetaan 1: 1.

Marc B
sumber
2
Kecuali bahwa Anda tidak dapat dengan mudah menunjukkan bahwa hamburger tertentu sepenuhnya berasal dari sapi tertentu, yang merupakan properti mendasar dari hash, jadi itu ide yang lucu tetapi analogi yang mengerikan.
user467257
1
@caf lol memang dan klasik pada saat itu. Namun, sapi hampir tidak pernah berhasil dipasarkan, itu adalah "banteng" yang melakukan ;-) Sapi: susu. Banteng: daging.
Funk Forty Niner
1
Kisah di baliknya terdengar sangat lezat.
sitilge
44

Gunakan hash saat Anda tidak ingin mendapatkan kembali input asli, gunakan enkripsi ketika Anda melakukannya.

Hash mengambil beberapa input dan mengubahnya menjadi beberapa bit (biasanya dianggap sebagai angka, seperti integer 32 bit, integer 64 bit, dll). Input yang sama akan selalu menghasilkan hash yang sama, tetapi Anda PRINCIPALLY kehilangan informasi dalam proses sehingga Anda tidak dapat mereproduksi input asli dengan andal (ada beberapa peringatan untuk itu).

Enkripsi pada dasarnya menjaga semua informasi yang Anda masukkan ke dalam fungsi enkripsi, hanya menyulitkan (idealnya mustahil) bagi siapa pun untuk kembali ke input asli tanpa memiliki kunci tertentu.

Contoh Sederhana Hashing

Berikut ini adalah contoh sepele untuk membantu Anda memahami mengapa hashing tidak dapat (dalam kasus umum) mendapatkan kembali input asli. Katakanlah saya sedang membuat hash 1-bit. Fungsi hash saya mengambil string bit sebagai input dan menetapkan hash ke 1 jika ada jumlah bit genap yang diatur dalam string input, atau 0 jika ada angka ganjil.

Contoh:

Input    Hash
0010     0
0011     1
0110     1
1000     0

Perhatikan bahwa ada banyak nilai input yang menghasilkan hash 0, dan banyak yang menghasilkan hash dari 1. Jika Anda tahu hash adalah 0, Anda tidak bisa tahu pasti apa input aslinya.

Omong-omong, hash 1-bit ini tidak sepenuhnya dibuat-buat ... lihatlah pada parity bit .

Contoh Enkripsi Sederhana

Anda dapat mengenkripsi teks dengan menggunakan substitusi huruf sederhana, katakan jika inputnya adalah A, Anda menulis B. Jika inputnya adalah B, Anda menulis C. Sepanjang jalan hingga akhir alfabet, di mana jika inputnya adalah Z, Anda tulis A lagi.

Input   Encrypted
CAT     DBU
ZOO     APP

Sama seperti contoh hash sederhana, jenis enkripsi ini telah digunakan secara historis .

Eric J.
sumber
Perlu dicatat bahwa "enkripsi" bahasa sehari-hari mengacu pada enkripsi yang kuat dan tidak boleh dikacaukan dengan enkripsi yang lemah seperti cipher Caesar pada contoh di atas.
Faks
@Fax Ya, tapi apa yang merupakan enkripsi kuat telah menjadi bilah bergerak sepanjang zaman. Mesin Enigma WWII Jerman hampir tidak mungkin untuk dipecahkan (ada film hebat tentang itu). Hari ini, jam tangan pintar Anda bisa dengan mudah memecahkannya. DES pernah dianggap kuat, seperti MD5. Enkripsi yang kuat hari ini mengancam akan menjadi mangsa yang mudah bagi teknik komputasi kuantum di masa mendatang.
Eric J.
Yang pasti, dan itu selalu merupakan ide yang baik untuk memeriksa tanggal posting dan artikel yang memberikan saran tentang kriptografi. Yang sedang berkata, saya cukup yakin sandi Caesar dianggap lemah bahkan pada tahun 2011.
Fax
39

Gambaran dasar teknik hashing dan enkripsi / dekripsi adalah.

Hashing:

Jika Anda hash setiap teks biasa lagi Anda tidak bisa mendapatkan plain text yang sama dari teks hash . Cukup, Ini adalah proses satu arah.

hashing


Enkripsi dan Dekripsi:

Jika Anda mengenkripsi setiap teks biasa dengan kunci lagi Anda bisa mendapatkan plain text yang sama dengan melakukan dekripsi pada teks terenkripsi dengan yang sama (simetris) / berbeda (asymentric) kunci.

enkripsi dan dekripsi


UPDATE: Untuk membahas poin-poin yang disebutkan dalam pertanyaan yang diedit.

1. Kapan harus menggunakan hash vs enkripsi

Hashing berguna jika Anda ingin mengirim file kepada seseorang. Tetapi Anda takut orang lain mungkin akan mencegat file dan mengubahnya. Jadi cara agar penerima dapat memastikan bahwa itu adalah file yang tepat adalah jika Anda memposting nilai hash secara publik. Dengan cara itu penerima dapat menghitung nilai hash dari file yang diterima dan memeriksa apakah itu cocok dengan nilai hash.

Enkripsi baik jika Anda mengatakan memiliki pesan untuk dikirim ke seseorang. Anda mengenkripsi pesan dengan kunci dan penerima mendekripsi dengan kunci yang sama (atau bahkan mungkin berbeda) untuk mendapatkan kembali pesan asli. kredit


2. Apa yang membuat algoritma hash atau enkripsi berbeda (dari tingkat teoretis / matematika) yaitu apa yang membuat hash tidak dapat diubah (tanpa bantuan pohon pelangi)

Pada dasarnya hashing adalah operasi yang kehilangan informasi tetapi tidak enkripsi . Mari kita lihat perbedaan dalam cara matematika sederhana untuk memudahkan kita memahami , tentu saja keduanya memiliki operasi matematika yang jauh lebih rumit dengan pengulangan yang terlibat di dalamnya

Enkripsi / Dekripsi (Reversibel):

Tambahan :

4 + 3 = 7  

Ini dapat dibalik dengan mengambil jumlah dan mengurangi salah satu dari tambahan

7 - 3 = 4     

Perkalian :

4 * 5 = 20  

Ini dapat dibalik dengan mengambil produk dan membaginya dengan salah satu faktor

20 / 4 = 5    

Jadi, di sini kita dapat mengasumsikan bahwa salah satu tambahan / faktor adalah kunci dekripsi dan hasilnya (7,20) adalah teks yang dienkripsi.


Hashing (Tidak Dapat Dikembalikan):

Divisi Modulo :

22 % 7 = 1   

Ini tidak dapat dibalik karena tidak ada operasi yang dapat Anda lakukan untuk hasil bagi dan dividen untuk menyusun kembali pembagi (atau sebaliknya).

Bisakah Anda menemukan operasi untuk mengisi di mana '?' adalah?

1  ?  7 = 22  
1  ?  22 = 7

Jadi fungsi hash memiliki kualitas matematika yang sama dengan divisi modulo dan kehilangan informasinya.

kredit

mrsrinivas
sumber
26

My one liner ... umumnya Pewawancara menginginkan jawaban di bawah ini.

Hashing adalah satu cara. Anda tidak bisa mendapatkan konversi data / string dari kode hash.

Enkripsi adalah 2 arah - Anda dapat mendekripsi lagi string terenkripsi jika Anda memiliki kunci bersama Anda.

Shiv Mohan
sumber
Hei! Itu dua baris.
Mark Storer
17

Sebuah fungsi Hash ternyata sejumlah variabel berukuran teks ke dalam teks berukuran tetap.

Hash

Sumber: https://en.wikipedia.org/wiki/Hash_function


Fungsi hash dalam PHP

Hash mengubah string menjadi string hash. Lihat di bawah.

HASH:

$str = 'My age is 29';
$hash = hash('sha1', $str);
echo $hash; // OUTPUT: 4d675d9fbefc74a38c89e005f9d776c75d92623e

Kata sandi biasanya disimpan dalam representasi hash alih-alih sebagai teks yang dapat dibaca. Ketika pengguna akhir ingin mendapatkan akses ke aplikasi yang dilindungi dengan kata sandi maka kata sandi harus diberikan selama otentikasi. Ketika pengguna mengirimkan kata sandi, maka sistem otentikasi yang valid menerima kata sandi dan mem-hash kata sandi yang diberikan ini. Kata sandi hash ini dibandingkan dengan hash yang diketahui oleh sistem. Akses diberikan dalam hal kesetaraan.

DEHASH:

SHA1 adalah hash satu arah. Yang berarti Anda tidak bisa menghilangkan hash.

Namun, Anda dapat dengan kasar memaksa hash. Silakan lihat: https://hashkiller.co.uk/sha1-decrypter.aspx .

MD5, adalah hash lain. Dehasher MD5 dapat ditemukan di situs web ini: https://www.md5online.org/ .

Untuk menghambat serangan brute-force pada hash, garam bisa diberikan. Di php, Anda dapat menggunakan password_hash()untuk membuat hash kata sandi. Fungsi password_hash()secara otomatis membuat garam. Untuk memverifikasi kata sandi pada hash kata sandi (dengan garam) gunakan password_verify().

// Invoke this little script 3 times, and it will give you everytime a new hash
$password = '1234';  
$hash = password_hash($password, PASSWORD_DEFAULT);  

echo $hash; 
// OUTPUT 

$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu 

$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u 

$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW

Satu kata sandi dapat diwakili oleh lebih dari satu hash. Ketika Anda memverifikasi kata sandi dengan hash kata sandi yang berbeda dengan menggunakan password_verify(), maka kata sandi akan diterima sebagai kata sandi yang valid.

$password = '1234';  

$hash = '$2y$10$ADxKiJW/Jn2DZNwpigWZ1ePwQ4il7V0ZB4iPeKj11n.iaDtLrC8bu';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$H8jRnHDOMsHFMEZdT4Mk4uI4DCW7/YRKjfdcmV3MiA/WdzEvou71u';  
var_dump( password_verify($password, $hash) );  

$hash = '$2y$10$qhyfIT25jpR63vCGvRbEoewACQZXQJ5glttlb01DmR4ota4L25jaW';  
var_dump( password_verify($password, $hash) );

// OUTPUT 

boolean true 

boolean true 

boolean true




Sebuah fungsi Enkripsi mengubah teks menjadi ciphertext masuk akal dengan menggunakan kunci enkripsi, dan sebaliknya. masukkan deskripsi gambar di sini

Sumber: https://en.wikipedia.org/wiki/Encryption


Enkripsi dalam PHP

Mari selami beberapa kode PHP yang menangani enkripsi.

--- Perpanjangan Mcrypt ---

ENCRYPT:

$cipher = MCRYPT_RIJNDAEL_128;
$key = 'A_KEY';
$data = 'My age is 29';
$mode = MCRYPT_MODE_ECB;

$encryptedData = mcrypt_encrypt($cipher, $key , $data , $mode);
var_dump($encryptedData);

//OUTPUT:
string '„Ùòyªq³¿ì¼üÀpå' (length=16)

DECRYPT:

$decryptedData = mcrypt_decrypt($cipher, $key , $encryptedData, $mode);
$decryptedData = rtrim($decryptedData, "\0\4"); // Remove the nulls and EOTs at the END
var_dump($decryptedData);

//OUTPUT:
string 'My age is 29' (length=12)

--- Ekstensi OpenSSL ---

Perpanjangan Mcrypt tidak digunakan lagi pada 7.1. dan dihapus di php 7.2. Ekstensi OpenSSL harus digunakan di php 7. Lihat cuplikan kode di bawah ini:

$key = 'A_KEY';
$data = 'My age is 29';

// ENCRYPT
$encryptedData = openssl_encrypt($data , 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($encryptedData);

// DECRYPT    
$decryptedData = openssl_decrypt($encryptedData, 'AES-128-CBC', $key, 0, 'IV_init_vector01');
var_dump($decryptedData);

//OUTPUT
string '4RJ8+18YkEd7Xk+tAMLz5Q==' (length=24)
string 'My age is 29' (length=12)
Julian
sumber
Perhatikan bahwa PHP mcrypt telah ditinggalkan sekarang (saya mungkin ada hubungannya dengan itu) dan bahwa SHA-1, MD5 dan ECB semuanya dianggap tidak aman. A_KEYadalah tidak AES / Rijndael-128 kunci; itu kata sandi, bukan kata kunci.
Maarten Bodewes
@ MaartenBodewes Ya itu benar. OpenSSL adalah mode sekarang. php.net/manual/en/book.openssl.php
Julian
10

Enkripsi Simetris:

Enkripsi simetris juga dapat disebut sebagai kunci bersama atau enkripsi rahasia bersama. Dalam enkripsi simetris, satu kunci digunakan untuk mengenkripsi dan mendekripsi lalu lintas.

masukkan deskripsi gambar di sini

Enkripsi Asimetris:

Enkripsi asimetris juga dikenal sebagai kriptografi kunci publik. Enkripsi asimetris berbeda dari enkripsi simetris terutama dalam dua kunci yang digunakan: satu untuk enkripsi dan satu untuk dekripsi. Algoritma enkripsi asimetris yang paling umum adalahRSA .

Dibandingkan dengan enkripsi simetris, enkripsi asimetris memaksakan beban komputasi yang tinggi, dan cenderung jauh lebih lambat. Dengan demikian, biasanya tidak digunakan untuk melindungi data payload. Sebaliknya, kekuatan utamanya adalah kemampuannya untuk membangun saluran yang aman di atas media yang tidak aman (misalnya, Internet). Ini dilakukan dengan pertukaran kunci publik, yang hanya dapat digunakan untuk mengenkripsi data. Kunci pribadi pelengkap, yang tidak pernah dibagikan, digunakan untuk mendekripsi.

masukkan deskripsi gambar di sini

Hashing:

Akhirnya, hashing adalah bentuk keamanan kriptografi yang berbeda dari enkripsi. Sedangkan enkripsi adalah proses dua langkah yang digunakan untuk pertama kali mengenkripsi dan kemudian mendekripsi pesan, hashing memadatkan pesan menjadi nilai panjang tetap yang tidak dapat diubah, atau hash. Dua algoritma hashing yang paling umum terlihat dalam jaringan adalah MD5dan SHA-1.

masukkan deskripsi gambar di sini

Baca lebih lanjut di sini: http://packetlife.net/blog/2010/nov/23/symmetric-asymmetric-encryption-hashing/

Vahid Farahmandian
sumber
Maaf, saya newb keamanan, tetapi bisakah Anda menjelaskan arti "biasanya digunakan untuk melindungi data payload" lebih lanjut?
Abdul
2
@Abdul Enkripsi asimetris memiliki beban komputasi yang tinggi sehingga tidak digunakan untuk melindungi data yang dikirim melalui jaringan sebagai paket (payload). Sebaliknya, ini digunakan untuk membangun koneksi jaringan yang aman menggunakan pertukaran kunci publik untuk melindungi data.
Beruntung
5
  1. Gunakan hash saat Anda hanya perlu berjalan satu arah. Misalnya, untuk kata sandi dalam suatu sistem, Anda menggunakan hashing karena Anda hanya akan memverifikasi bahwa nilai yang dimasukkan pengguna, setelah hashing, cocok dengan nilai dalam repositori Anda. Dengan enkripsi, Anda dapat melakukan dua cara.

  2. algoritma hashing dan algoritma enkripsi hanyalah algoritma matematika. Jadi dalam hal itu mereka tidak berbeda - itu semua hanya rumus matematika. Semantik bijaksana, meskipun, ada perbedaan yang sangat besar antara hashing (satu arah) dan enkripsi (dua arah). Mengapa hash tidak dapat diubah? Karena mereka dirancang seperti itu, karena kadang-kadang Anda menginginkan operasi satu arah.

hvgotcodes
sumber
4

Algoritma enkripsi dan hash bekerja dengan cara yang serupa. Dalam setiap kasus, ada kebutuhan untuk menciptakan kebingungan dan difusi di antara bit. Mendidih, kebingungan menciptakan hubungan yang kompleks antara kunci dan ciphertext, dan difusi menyebarkan informasi dari setiap bit di sekitar.

Banyak fungsi hash sebenarnya menggunakan algoritma enkripsi (atau primitif algoritma enkripsi. Misalnya, kandidat SHA-3 Skein menggunakan Threefish sebagai metode yang mendasari untuk memproses setiap blok. Perbedaannya adalah bahwa alih-alih menjaga setiap blok ciphertext, mereka secara destruktif, secara deterministik digabung bersama menjadi panjang tetap

Justin Morgan
sumber
4

ketika datang ke keamanan untuk mengirim data yaitu komunikasi dua arah Anda menggunakan enkripsi. Semua enkripsi memerlukan kunci

ketika datang ke otorisasi Anda menggunakan hashing. Tidak ada kunci dalam hashing

Hashing mengambil sejumlah data (biner atau teks) dan membuat hash panjang konstan yang mewakili checksum untuk data. Misalnya, hash mungkin 16 byte. Algoritma hashing yang berbeda menghasilkan hash ukuran yang berbeda. Anda jelas tidak dapat membuat kembali data asli dari hash, tetapi Anda dapat hash data lagi untuk melihat apakah nilai hash yang sama dihasilkan. Kata sandi berbasis Unix satu arah bekerja dengan cara ini. Kata sandi disimpan sebagai nilai hash, dan untuk masuk ke sistem, kata sandi yang Anda ketik adalah hash, dan nilai hash dibandingkan dengan hash kata sandi yang sebenarnya. Jika cocok, maka Anda harus mengetikkan kata sandi yang benar

mengapa hashing tidak dapat diubah:

Hashing tidak dapat dibalikkan karena pemetaan input-ke-hash bukan 1-ke-1. Memiliki dua input peta ke nilai hash yang sama biasanya disebut sebagai "tabrakan hash". Untuk tujuan keamanan, salah satu sifat fungsi hash "baik" adalah bahwa tabrakan jarang terjadi dalam penggunaan praktis.

ayush
sumber
1
"Hashing tidak dapat dibalik karena pemetaan input-ke-hash bukan 1-ke-1", Terima kasih, saya pikir itu adalah faktor yang sangat penting ketika harus membedakan hash dari enkripsi! :)
Kenny Cason
Ini tidak dengan jelas membedakan antara fungsi hash normal, fungsi hash kriptografis, dan hash kata sandi. Semua itu memiliki sifat berbeda.
Maarten Bodewes
-2

Penawaran kriptografi dengan angka dan string. Pada dasarnya setiap hal digital di seluruh alam semesta adalah angka. Ketika saya mengatakan angka, angka 0 & 1. Anda tahu apa itu angka biner. Gambar yang Anda lihat di layar, musik yang Anda dengarkan melalui earphone Anda, semuanya biner. Tapi telinga dan mata kita tidak akan mengerti binari, kan? Hanya otak yang dapat memahami itu, dan bahkan jika ia dapat memahami binari, ia tidak dapat menikmati binari. Jadi kami mengonversi binari ke format yang dapat dipahami manusia seperti mp3, jpg, dll. Mari kita sebut proses sebagai Encoding . Ini proses dua arah dan dapat dengan mudah diterjemahkan kembali ke bentuk aslinya.

Hashing

Hashing adalah teknik kriptografi lain di mana data yang pernah dikonversi ke bentuk lain tidak pernah dapat dipulihkan kembali. Dalam istilah Layman, tidak ada proses yang disebut de-hashing . Ada banyak fungsi hash untuk melakukan pekerjaan seperti sha-512, md5 dan sebagainya.

Jika nilai asli tidak dapat dipulihkan, lalu di mana kita menggunakan ini? Kata sandi! Ketika Anda mengatur kata sandi untuk ponsel atau PC Anda, hash kata sandi Anda dibuat dan disimpan di tempat yang aman. Ketika Anda membuat upaya login lain kali, string yang dimasukkan kembali hash dengan algoritma yang sama (fungsi hash) dan output dicocokkan dengan nilai yang disimpan. Jika sama, Anda login. Jika tidak, Anda akan diusir.

Kredit: wikimedia Dengan menerapkan hash pada kata sandi, kami dapat memastikan bahwa penyerang tidak akan pernah mendapatkan kata sandi kami meskipun ia mencuri file kata sandi yang disimpan. Penyerang akan memiliki hash kata sandi. Dia mungkin dapat menemukan daftar kata sandi yang paling umum digunakan dan menerapkan sha-512 untuk masing-masing dan membandingkannya dengan nilai di tangannya. Ini disebut serangan kamus . Tapi berapa lama dia akan melakukan ini? Jika kata sandi Anda cukup acak, apakah Anda pikir metode cracking ini akan berhasil? Semua kata sandi dalam database Facebook, Google dan Amazon adalah hash, atau setidaknya mereka seharusnya hash.

Lalu ada Enkripsi

Enkripsi terletak di antara hashing dan encoding. Pengkodean adalah proses dua arah dan tidak boleh digunakan untuk memberikan keamanan. Enkripsi juga merupakan proses dua arah, tetapi data asli dapat diambil jika dan hanya jika kunci enkripsi diketahui. Jika Anda tidak tahu cara kerja enkripsi, jangan khawatir, kami akan membahas dasar-dasarnya di sini. Itu akan cukup untuk memahami dasar-dasar SSL. Jadi, ada dua jenis Enkripsi yaitu enkripsi Symmetric dan Asymmetric.

Enkripsi Kunci Simetris

Saya mencoba untuk menjaga hal-hal sesederhana mungkin. Jadi, mari kita pahami enkripsi simetris dengan menggunakan algoritma shift. Algoritma ini digunakan untuk mengenkripsi huruf dengan menggeser huruf ke kiri atau kanan. Mari kita ambil string CRYPTO dan pertimbangkan nomor +3. Kemudian, format CRYPTO terenkripsi akan menjadi FUBSWR. Itu berarti setiap huruf digeser ke kanan oleh 3 tempat. Di sini, kata CRYPTO disebut Plaintext , output FUBSWR disebut Ciphertext , nilai +3 disebut kunci Enkripsi (kunci simetris) dan seluruh proses adalah a . Ini adalah salah satu algoritma enkripsi kunci simetris tertua dan dasar dan penggunaan pertamanya dilaporkan pada masa Julius Caesar. Jadi, itu dinamai menurut namanya dan itu yang terkenal cipher Caesar Cipher yang . Siapa pun yang mengetahui kunci enkripsi dan dapat menerapkan kebalikan dari algoritma Caesar dan mengambil Plaintext asli. Oleh karena itu disebut Enkripsi Simetris .

Enkripsi Kunci Asimetris

Kita tahu bahwa, dalam enkripsi Symmetric kunci yang sama digunakan untuk enkripsi dan dekripsi. Setelah kunci itu dicuri, semua data hilang. Itu risiko yang sangat besar dan kami membutuhkan teknik yang lebih kompleks. Pada tahun 1976, Whitfield Diffie dan Martin Hellman pertama kali menerbitkan konsep enkripsi Asymmetric dan algoritma ini dikenal sebagai pertukaran kunci Diffie-Hellman . Kemudian pada tahun 1978, Ron Rivest, Adi Shamir dan Leonard Adleman dari MIT menerbitkan algoritma RSA . Ini dapat dianggap sebagai dasar kriptografi Asimetris.

Dibandingkan dengan enkripsi Symmetric, dalam enkripsi Asymmetric , akan ada dua kunci, bukan satu. Satu disebut kunci Publik , dan yang lainnya adalah kunci Pribadi . Secara teoritis, selama inisiasi kita dapat menghasilkan Public-Privatepasangan kunci ke mesin kami. Kunci pribadi harus disimpan di tempat yang aman dan tidak boleh dibagikan dengan siapa pun. Kunci publik, seperti yang ditunjukkan namanya, dapat dibagikan dengan siapa saja yang ingin mengirim teks terenkripsi kepada Anda. Sekarang, mereka yang memiliki kunci publik Anda dapat mengenkripsi data rahasia bersamanya. Jika pasangan kunci dihasilkan menggunakan algoritma RSA, maka mereka harus menggunakan algoritma yang sama saat mengenkripsi data. Biasanya algoritma akan ditentukan dalam kunci publik. Data terenkripsi hanya dapat didekripsi dengan kunci pribadi yang Anda miliki.

Sumber: SSL / TLS untuk boneka bagian 1: Ciphersuite, Hashing, Enkripsi | WST ( https://www.wst.space/ssl-part1-ciphersuite-hashing-encryption/ )

Platypus Anonim
sumber
-3

Enkripsi Tujuan enkripsi adalah untuk mentransformasikan data agar merahasiakannya. Eg (Mengirimkan seseorang teks rahasia yang hanya dapat mereka baca, mengirim kata sandi melalui Internet).

Alih-alih memfokuskan kegunaan, tujuannya adalah untuk memastikan pengiriman data dapat dikirim secara diam-diam dan hanya dapat dilihat oleh pengguna yang Anda kirim.

Ini Mengenkripsi data ke dalam format lain untuk mengubahnya menjadi pola unik. Ia dapat dienkripsi dengan kunci rahasia dan pengguna yang memiliki kunci rahasia dapat dapat melihat pesan dengan membalikkan proses. Misalnya (AES, BLOWFISH, RSA)

Enkripsi mungkin terlihat seperti FhQp6U4N28GITVGjdt37hZN ini

Hashing In secara teknis kita dapat mengatakannya sebagai mengambil input arbiter dan menghasilkan string panjang tetap.

Paling penting dalam hal ini adalah Anda tidak dapat beralih dari output ke input. Ini menghasilkan output yang kuat bahwa informasi yang diberikan belum dimodifikasi. Prosesnya adalah mengambil input dan hash lalu mengirim dengan kunci pribadi pengirim begitu penerima menerimanya, mereka dapat memvalidasinya dengan kunci publik pengirim.

Jika hash salah dan tidak cocok dengan hash, kami tidak dapat melihat informasinya. Misalnya (MD5, SHA .....)

neevan
sumber