Itu pertanyaan yang cukup besar =) Di bawah ini adalah ikhtisar tingkat tinggi HTTPS; berteriak jika ada yang tidak jelas dan saya akan mengisi lebih banyak detail.
Saat Anda menggunakan koneksi HTTPS, crypto kunci publik hanya digunakan selama inisialisasi sesi. Bagian dari inisialisasi itu adalah pertukaran aman dari kunci pribadi yang dibagikan yang kemudian digunakan untuk enkripsi simetris. Alasannya adalah karena enkripsi asimetris (kunci publik) jauh lebih lambat daripada enkripsi kunci simetris, karena matematika yang terlibat.
Jabat tangan SSL
Pada level yang sangat tinggi, protokolnya kira-kira seperti ini:
Klien mengirimkan pesan "HELLO" awal, yang berisi versi ssl yang ingin digunakan, serangkaian bit pseudo-acak (sebut saja B1) dan daftar berbagai cipher yang didukungnya.
Server merespons dengan pesan "HELLO" sendiri, string pseudo-acak bit (sebut B2), cipher yang dipilihnya (biasanya cipher terkuat dari daftar yang dikirim klien yang didukung server), dan servernya sertifikat yang berisi kunci publiknya (sebut saja itu k ).
Klien kemudian menggunakan sertifikat untuk mengotentikasi server (lihat di bawah) dan membuat "rahasia premaster" - string lain bit pseduo-acak yang akan kita sebut S.
Jika klien senang dengan hasil otentikasi server, itu mengenkripsi rahasia premaster S dengan kunci publik server k , dan mengirimkannya ke server (S sendiri dienkripsi, tetapi koneksi masih belum).
Pada titik ini, server dan klien berbagi tiga string bit - B1, B2 dan S. B1 dan B2 dikirim dengan jelas - S dienkripsi, dan dengan demikian, dengan asumsi kunci privat server benar-benar pribadi, hanya diketahui oleh klien dan server.
Baik klien dan server kemudian menggunakan tiga string ini untuk membangun kunci sesi - string yang hanya diketahui oleh mereka, dan dapat digunakan sebagai kunci dalam cipher simetris yang dipilih sebelumnya.
Klien dan server kemudian bertukar pesan yang menunjukkan mereka mengubah protokol, dan semua pesan berikutnya dienkripsi (simetris, dengan kunci dihitung di atas).
Otentikasi server
Ketika klien menerima pesan HELLO server, ia perlu memastikan bahwa itu berbicara ke server yang dianggapnya pesan itu. Sertifikat dan kunci server digunakan untuk membangun kepercayaan ini.
Semua sertifikat digital adalah pihak ketiga yang menyatakan "entitas ini memegang kunci pribadi yang terkait dengan kunci publik ini, yang tertanam dalam sertifikat ini". Organisasi seperti Verisign akan membuat pernyataan ini - dengan harga tertentu. Alasan orang membayar Verisign dan lain-lain untuk sertifikat adalah bahwa Verisign mengalami kesulitan untuk mendapatkan sertifikat perantara mereka tertanam di sebagian besar browser umum.
Jadi, ketika klien menerima server HELLO, ia akan melakukan pemeriksaan berikut:
- Apakah tanggal hari ini termasuk dalam periode validitas sertifikat?
- Apakah nama subjek sertifikat cocok dengan nama server yang saya coba hubungi?
- Apakah nama Penerbit pada sertifikat cocok dengan salah satu CA yang memiliki kunci publik yang saya ketahui?
- Jika demikian, apakah kunci publik yang saya miliki untuk CA ini memvalidasi sertifikat ini?
Jika semua cek lulus, klien menganggap dapat percaya bahwa server adalah yang diharapkan. Itu kemudian mengambil kunci publik (masih k ) keluar dari sertifikat, dan menggunakannya untuk mentransmisikan S ke server dengan aman. Pada titik ini, idenya adalah bahwa Anda memiliki beberapa pernyataan pihak ketiga (Verisign) bahwa kunci publik adalah milik server; jadi hanya server yang akan dapat mendekripsi hasil E (S, k ), dan karenanya hanya server yang dapat menghasilkan kunci yang cocok yang akan Anda gunakan untuk sandi simetris.
Setelah jabat tangan, kepercayaan diri Anda bahwa paket tidak dapat dibaca oleh pihak ketiga harus sama dengan keyakinan Anda pada algoritma simetris yang digunakan.
(Ada tikungan-tikungan bagus lainnya - misalnya alasan penggunaan tiga senar bit adalah untuk mencegah serangan replay. Jika hanya S yang digunakan, penyerang dapat merekam seluruh sesi dan memutarnya kembali pada waktu luang - misalnya, mengulangi instruksi transfer uang berulang dan Dengan klien dan server menghasilkan string pseduo-random tambahan, Anda sangat mengurangi kemungkinan dua jabat tangan SSL independen menghasilkan S. yang sama)
Pertanyaan Anda agak umum. Apa sebenarnya yang kamu cari?
Sudahkah Anda membaca yang terkait wikipedia masuk?
sumber
Dalam kedua kasus, Anda menggunakan kunci publik situs web (situs belanja atau bank) untuk menegosiasikan kunci enkripsi untuk sesi saat ini. Kunci enkripsi ini digunakan untuk mengenkripsi semua komunikasi setelah itu. Ini bukan kunci asimetris (bukan kunci publik-kunci-privat-pasangan), ini adalah kunci rahasia "biasa" yang dibagi antara browser Anda dan situs (dan akan dimusnahkan ketika Anda menutup jendela).
Alasan untuk menggunakan enkripsi kunci publik hanya untuk mengirimkan kunci rahasia adalah bahwa jauh lebih cepat untuk melakukan enkripsi simetris. Ini juga sama-sama aman. Dan, seperti yang telah Anda tunjukkan, hanya satu sisi yang perlu memiliki kunci publik.
Bahkan, satu-satunya alasan bahwa situs web perlu memiliki kunci publik sama sekali, adalah agar Anda dapat yakin dengan siapa Anda berbicara. Ini mencegah serangan man-in-the-middle. Untuk tujuan menjaga koneksi aman dari penyadap, itu tidak sepenuhnya diperlukan. Bahkan, banyak situs web menggunakan kunci publik yang ditandatangani sendiri (bukan disertifikasi oleh otoritas registrasi) untuk SSL. Dalam hal ini, Anda tidak dapat benar-benar yakin bahwa pihak lain benar-benar seperti yang mereka klaim, tetapi Anda dapat yakin bahwa tidak ada pihak ketiga yang dapat mendengarkan.
sumber
Ada dua jenis sandi yang digunakan di sini. Ada tipe kunci publik (asimetris), dan tipe kunci-kunci (simetris) yang lebih umum. Cipher simetris jauh lebih efisien, karena tidak ada banyak cara untuk mengatur cipher kunci publik.
Karena itu, Anda menggunakan kunci publik untuk melakukan kontak. Browser Anda kemudian dapat mengenkripsi kunci bersama dengan kunci publik situs, dan hanya situs yang dapat menerima kunci bersama. Kemudian browser Anda dan situs web berkomunikasi dengan cipher standar. Kunci biasanya dibuang di akhir sesi. Karena itu, selama semuanya berjalan dengan benar, komunikasi Anda aman.
Ada juga pertanyaan untuk memastikan dengan siapa Anda berbicara. Untuk tujuan ini, situs web memiliki sertifikat, yang merupakan pengesahan dari otoritas sertifikat yang Anda ajak bicara kepada siapa pun yang meminta sertifikat. Otoritas sertifikat dimuat ke browser Anda saat Anda mendapatkannya, dan sertifikat apa pun yang ditandatangani oleh salah satu dari mereka akan diterima oleh browser Anda. Beberapa otoritas menawarkan sertifikat dengan harga lebih tinggi yang akan ditampilkan di peramban Anda sebagai hijau, dan sertifikat itu telah lebih hati-hati diverifikasi oleh otoritas sertifikat yang bersangkutan.
Saya tidak mengatakan ini adalah cara terbaik untuk melakukan ini. Misalnya, saya ingin melihat peringatan ketika Anda mendapatkan sertifikat berbeda untuk situs web yang sama, peringatan yang sering digunakan dalam aplikasi crypto kunci publik lainnya. Saya tidak berpikir peringatan Firefox untuk sertifikat yang ditandatangani sendiri adalah tepat (yang menunjukkan situs yang menggunakan kunci publik kripto tanpa membeli sertifikat), karena itu membuat situs tersebut terlihat kurang dapat dipercaya daripada koneksi yang tidak terenkripsi.
(Saya tidak akan membahas perincian teknis di sini, tetapi ini adalah aplikasi cipher kunci publik dan hash kriptografi yang cukup mudah. Hash adalah metode untuk mengurangi file atau sesuatu menjadi pengidentifikasi lengh tetap, sehingga dua file tidak mungkin untuk memiliki nilai yang sama. Hash kriptografi adalah salah satu di mana sangat sulit untuk membuat dua file dengan nilai hash yang sama.)
sumber
Jawaban sederhana: Cara yang persis sama.
Misalkan A dapat mengirim data dengan aman ke B tetapi B hanya dapat mengirim data secara tidak aman ke A. Yang harus Anda lakukan adalah memiliki A membuat kunci acak dan mengirimkannya dengan aman ke B. Sekarang B dapat mengenkripsi data dengan kunci acak itu, kirimkan ke A, dan itu aman.
Jadi, jika Anda memiliki tautan dua arah yang hanya aman dalam satu arah, itu mudah untuk membuatnya aman di kedua arah.
sumber
Anda tahu siapa bank itu karena browser Anda mengakui sertifikatnya sebagai valid. Tapi bagaimana bank tahu itu kamu? Jawabannya adalah tidak, setidaknya bukan dari SSL. Browser Anda MEMBUAT kunci pribadi PER SESI. Kunci pribadi ini tidak ada artinya bagi bank, karena Anda masih bisa menjadi siapa saja. Namun, kunci privat itu tidak memberi Anda koneksi aman. Karena Anda mempercayai situs web bank, Anda masuk menggunakan koneksi aman, dan pada saat itu ia tahu bahwa Anda adalah Anda, dan bahwa sesi tersebut aman untuk data tentang Anda.
Bank mengenkripsi data untuk browser Anda menggunakan kunci publik yang diberikan browser saat sesi dimulai, dan Anda mengenkripsi hal-hal untuk bank menggunakan kunci publik mereka. Prosesnya sama di kedua arah, pada dasarnya, begitu Anda menetapkan identitas.
sumber