44
Bài 4 Bảo mật cho website

Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Embed Size (px)

DESCRIPTION

Kết nối bảo mật và giao thức SSL Xác thực cho website Mã hóa và giải mã dữ liệu

Citation preview

Page 1: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Bài 4Bảo mật cho website

Page 2: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Kết nối bảo mật và giao thức SSLXác thực cho websiteMã hóa và giải mã dữ liệu

Mục tiêu

Bài 4 - Bảo mật cho website 2

Page 3: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Giới thiệu về kết nối bảo mậtLấy một chứng nhận bảo mật điện tửYêu cầu một kết nối bảo mậtChuyển hướng một kết nối bảo mật

Kết nối bảo mật và giao thức SSL

Bài 4 - Bảo mật cho website 3

Page 4: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Hình ảnh một yêu cầu kết nối bảo mật:

Kết nối bảo mật

Bài 4 - Bảo mật cho website 4

Page 5: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Kết nối bảo mật (secure connection): ngăn chặndữ liệu bị đọc được trong quá trình truyền tảiqua InternetKết nối được bảo mật thường chậm hơn kết nốithường: phải mã hóa và giải mã dữ liệuCách xác định kết nối bảo mật: HTTPS

Kết nối bảo mật

Bài 4 - Bảo mật cho website 5

Page 6: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Hai loại giao thức:SSL (Secure Sockets Layer): giao thức cũTLS (Transport Layer Security): giao thức mới, chỉ cócác trình duyệt mới ra gần đây mới hỗ trợ

Xác thực SSL phía máy chủXác thực SSL phía máy khách

Một số khái niệm

Bài 4 - Bảo mật cho website 6

Page 7: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Hình ảnh một chứng nhận bảo mật điện tử:

Chứng nhận bảo mật điện tử

Bài 4 - Bảo mật cho website 7

Page 8: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Chứng nhận phía máy chủChứng nhận phía máy khách

Hai loạichứng nhận bảo mật điện tử

Bài 4 - Bảo mật cho website 8

Page 9: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Trước khi kết nối được thiết lập, máy chủ sửdụng xác thực SSL phía máy chủ để tự xác thựcbằng cách cung cấp một chứng nhận bảo mậtđiện tử cho trình duyệt

Mặc định thì trình duyệt sẽ chấp nhận các chứngnhận bảo mật điện tử từ các nguồn tin cậy(trusted sources)

Cơ chế làm việc của SSL

Bài 4 - Bảo mật cho website 9

Page 10: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Nếu chứng nhận bảo mật không phải của nguồntin cậy thì trình duyệt thông báo để người dùngtự quyết định

Trong một vài trường hợp, máy khách có thể tựxác nhận với xác thực SSL phía máy khách bằngcách cài sẵn chứng nhận bảo mật điện tử

Cơ chế làm việc của SSL

Bài 4 - Bảo mật cho website 10

Page 11: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Để sử dụng SSL trong ứng dụng web thì bạn cầnmua một chứng nhận bảo mật điện tửCác loại cấp độ bảo mật SSL:

40 bit56 bit128 bit256 bit

Khái niệm

Bài 4 - Bảo mật cho website 11

Page 12: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Cơ quan chứng nhận (Certification Authority -CA)Cơ quan đăng ký (Registration Authority - RA)

Khái niệm

Bài 4 - Bảo mật cho website 12

Page 13: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Địa chỉ kiểm trakết nối bảo mật trong mạng nội bộ

Bài 4 - Bảo mật cho website 13

//Kiểm tra kết nối bảo mật được thiết lập đúng chưahttps://localhost/

//Yêu cầu một kết nối bảo mậthttps://localhost/book_apps/ch21_ssl/

//Trả về một kết nối thông thườnghttp://localhost/book_apps.ch21_ssl/

Page 14: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Địa chỉ kiểm trakết nối bảo mật trên Internet

Bài 4 - Bảo mật cho website 14

//Yêu cầu một kết nối bảo mậthttps://www.murach.com/

//Trả về một kết nối thông thườnghttp://www.murach.com/

Page 15: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Thành phần:HTTPSHTTP_HOSTREQUEST_URI

Mảng $_SERVER

Bài 4 - Bảo mật cho website 15

Page 16: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

File chuyển hướngtới kết nối bảo mật

Bài 4 - Bảo mật cho website 16

<?php//Đảm bảo trang web sử dụng kết nối bảo mậtif (!isset($_SERVER['HTTPS'])) {

$url = 'https://' . $_SERVER['HTTP_HOST'] .$_SERVER['REQUEST_URI'];

header("Location: " . $url);exit();

}?>

Page 17: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Ba loại xác thựcSử dụng xác thực dạng formSử dụng xác thực cơ bản

Sử dụng xác thực (authentication)

Bài 4 - Bảo mật cho website 17

Page 18: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Xác thực dạng form:Cho phép nhà phát triển viết form đăng nhập để lấytên tài khoản và mật khẩuCho phép chỉ yêu cầu tên tài khoản và mật khẩu mộtlần duy nhất trong mỗi phiên làm việcMặc định không mã hóa tên tài khoản và mật khẩutrước khi gửi lên máy chủ

Ba loại xác thực

Bài 4 - Bảo mật cho website 18

Page 19: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Xác thực cơ bản:Trình duyệt hiển thị hộp thoại để lấy tên tài khoản vàmật khẩuĐòi hỏi trình duyệt gửi tên tài khoản và mật khẩu chomỗi trang được bảo vệMặc định không mã hóa tên tài khoản và mật khẩutrước khi gửi lên máy chủ

Xác thực rút gọn:Trình duyệt hiển thị hộp thoại để lấy tên tài khoản vàmật khẩuMã hóa tên tài khoản và mật khẩu trước khi gửi lênmáy chủ

Ba loại quá trình xác thực

Bài 4 - Bảo mật cho website 19

Page 20: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Hàm sha1($string [, $bin])Ví dụ: Lưu trữ và xác nhận mật khẩu:

Hàm mã hóa dữ liệu

Bài 4 - Bảo mật cho website 20

<?phpfunction add_admin($email, $password) {

global $db;$password = sha1($email . $password);$query = 'INSERT INTO administrators (emailAddress,

password) VALUES (:email, :password)';$statement = $db->prepare($query);$statement->bindValue(':email', $email);$statement->bindValue(':password', $password);$statement->execute();$statement->closeCursor();

}

Page 21: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Hàm mã hóa dữ liệu

Bài 4 - Bảo mật cho website 21

function is_valid_admin_login($email, $password) {global $db;$query = 'SELECT adminID FROM administrators WHERE

emailAddress=:email AND password=:password';$statement = $db->prepare($query);$statement->bindValue(':email', $email);$statement->bindValue(':password', $password);$statement->execute();$valid = ($statement->rowCount() == 1);$statement->closeCursor();return $valid;

}?>

Page 22: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Form đăng nhậpcho xác thực dạng form

Bài 4 - Bảo mật cho website 22

Page 23: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Trang web được bảo vệ(protected page)

Bài 4 - Bảo mật cho website 23

Page 24: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Mã điều khiểncho trang web được bảo vệ

Bài 4 - Bảo mật cho website 24

<?php//Bắt đầu session và include các hàm cần thiếtsession_start();require_once('model/database.php');require_once('model/admin_db.php');

//Lấy thông tin về hành độngif (isset($_POST['action'])) {

$action = $_POST['action'];} else if (isset($_GET['action'])) {

$action = $_GET['action'];} else {

$action = 'show_admin_menu';}//Nếu người dùng chưa đăng nhập thì bắt buộc phải đăngnhậpif (!isset($_SESSION['is_valid_admin'])) {

$action = 'login';}

Page 25: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Mã điều khiểncho trang web được bảo vệ

Bài 4 - Bảo mật cho website 25

//Thực thi hành độngswitch($action) {

case 'login':$email = $_POST['email'];$password = $_POST['password'];if (is_valid_admin_login($email, $password))

{$_SESSION['is_valid_admin'] = true;include('view/admin_menu.php');

} else {$login_message = 'You must login to

view this page';include('view/login.php');

}break;

Page 26: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Mã điều khiểncho trang web được bảo vệ

Bài 4 - Bảo mật cho website 26

case 'show_admin_menu':include('view/admin_menu.php');break;

case 'show_product_manager':include('view/product_manager.php');break;

case 'show_order_manager':include('view/order_manager.php');break;

case 'logout':$_SESSION = array();session_destroy();$login_message = 'You have been logged out';include('view/login.php');break;

}

Page 27: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

File xác nhận tài khoản admin:

Đoạn mã ở đầu trang đăng nhập:

Áp dụng

Bài 4 - Bảo mật cho website 27

<?php//Đảm bảo người dùng tài khoản admin đúngif (!isset($_SESSION['is_valid_admin'])) {

header("Location: .");}?>

<?php//Đòi hỏi kết nối bảo mậtrequire_once('util/secure_conn.php');?>

Page 28: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Đoạn mã ở đầu các trang được bảo vệ:

Áp dụng

Bài 4 - Bảo mật cho website 28

<?php//Đòi hỏi kết nối bảo mậtrequire_once('util/secure_conn.php');//Đòi hỏi tài khoản người dùng đúngrequire_once('util/valid_admin.php');?>

Page 29: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Hình ảnh minh họacho xác thực cơ bản

Bài 4 - Bảo mật cho website 29

Page 30: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Trang web được bảo vệ

Bài 4 - Bảo mật cho website 30

Page 31: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Trang web không được xác thực

Bài 4 - Bảo mật cho website 31

Page 32: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Thành phần:PHP_AUTH_USERPHP_AUTH_PW

Mảng $_SERVERcho xác thực cơ bản

Bài 4 - Bảo mật cho website 32

Page 33: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Mã PHP đảm bảo tài khoản người dùng là đúng:

Ví dụ

Bài 4 - Bảo mật cho website 33

<?phprequire_once('model/database.php');require_once('model/admin_db.php');

$email = $_SERVER['PHP_AUTH_USER'];$password = $_SERVER['PHP_AUTH_PW'];if (!is_valid_admin_login($email, $password)) {

header('WWW-Authenticate: Basic realm="Admin"');header('HTTP/1.0 401 unauthorized');include('unauthorized.php');exit();

}?>

Page 34: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Mã PHP ở đầu mỗi trang web được bảo vệ:

Ví dụ

Bài 4 - Bảo mật cho website 34

<?php//Đòi hỏi kết nối bảo mậtrequire_once('util/secure_conn.php');

//Đòi hỏi tài khoản admin đúngrequire_once('util/valid_admin.php');?>

Page 35: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Giới thiệu thư viện mcryptCách mã hóa và giải mã dữ liệuLớp chứa dữ liệu được mã hóa

Mã hóa và giải mã dữ liệu

Bài 4 - Bảo mật cho website 35

Page 36: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

PHP cung cấp sẵn thư viện mcrypt để hỗ trợ mãhóa và giải mã dữ liệuMột số khái niệm:

CipherChế độ hoạt động (mode of operation)CBC (cipher-block chaining)Vector khởi tạo (Initialization Vector - IV)

Thư viện mcrypt

Bài 4 - Bảo mật cho website 36

Page 37: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Một số hàm trong thư viện mcrypt:Mcrypt_get_iv_size($cipher, $mode)Mcrypt_create_iv($ivs)Mcrypt_encrypt($cipher, $key, $data, $move, $iv)Mcrypt_decrypt(($cipher, $key, $data, $move, $iv)

Thư viện mcrypt

Bài 4 - Bảo mật cho website 37

Page 38: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Một số hằng trong thư viện mcrypt:MCRYPT_RIJNDAEL_128MCRYPT_RIJNDAEL_192MCRYPT_RIJNDAEL_256MCRYPT_MODE_CBC

Hai hàm chuyển đổi giữa dữ liệu nhị phân vàbase64:

Base64_encode($data)Base64_decode($data)

Thư viện mcrypt

Bài 4 - Bảo mật cho website 38

Page 39: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Ví dụ

Bài 4 - Bảo mật cho website 39

<?php$credit_card_no = '41111111111';//Khai báo các biến$cipher = MCRYPT_RIJDAEL_128;$mode = MCRYPT_MODE_CBC;$key = sha1('secretKey', true);$ivs = mcrypt_get_iv_size($cipher, $mode);$iv = mcrypt_create_iv($ivs);

//Mã hóa dữ liệu$data = mcrypt_encrypt($cipher, $key, $credit_card_no, $mode,$iv);$data = base64_encode($data);echo 'Encrypted data: '.$data.'<br/>';

//Giải mã dữ liệu$data = base64_decode($data);$credit_card_no = mcrypt_decrypt($cipher, $key,$credit_card_no, $mode, $iv);echo 'Decrypted data: '.$credit_card_no.'<br/>';?>

Page 40: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Lớp Crypt

Bài 4 - Bảo mật cho website 40

class Crypt {private $key;private $ivs;private $iv;private $cipher;private $mode;

public function __construct() {$this->cipher = MCRYPT_RIJDAEL_128;$this->mode = MCRYPT_MODE_CBC;$this->key = sha1('secretKey', true);$this->ivs = mcrypt_get_iv_size($this-

>cipher, $this->mode);$this->iv = mcrypt_create_iv($this->ivs);

}

Page 41: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Lớp Crypt

Bài 4 - Bảo mật cho website 41

public function encrypt($data) {$data = mcrypt_encrypt($this->cipher, $this-

>key, $data, $this->mode, $this->iv);$data = base64_encode($data);return $data;

}

public function decrypt($data) {$data = base64_decode($data);$data = mcrypt_decrypt($this->cipher, $this-

>key, $data, $this->mode, $this->iv);return $data;

}}?>

Page 42: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Sử dụng lớp Crypt

Bài 4 - Bảo mật cho website 42

require 'crypt.php';$credit_card_no = '4111111111111111111';

//Tạo đối tượng Crypt$crypt = new Crypt();

//Sử dụng đối tượng Crypt để mã hóa dữ liệu$data = $crypt->encrypt($credit_card_no);echo 'Encrypted data: ' . $data . '<br />';

//Sử dụng đối tượng Crypt để giải mã dữ liệu$credit_card_no = $crypt->decrypt($data);echo 'Decrypted data: ' . $credit_card_no . '<br />';

Page 43: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Kết nối bảo mật sử dụng giao thức TLS và SSLKhi trình duyệt gửi yêu cầu tới máy chủ qua kếtnối bảo mật thì máy chủ tự xác thực bằng chứngnhận bảo mật điện tử (digital secure certificate)

Bài 4 - Bảo mật cho website 43

Tổng kết bài học

Page 44: Bài 4 Bảo mật cho website - Xây dựng ứng dụng web

Quy trình sử dụng SSL trong ứng dụng web:Người dùng gửi yêu cầu mua chứng nhận bảo mậtđiện tử tới CACA xác thực thông tin yêu cầu quá RACA gửi cho người dùng chứng nhận bảo mật điện tửNgười dùng gửi cho người quản trị hosting để cài lênmáy chủ

Mã hóa dữ liệu bằng hàm sha1PHP cung cấp thư viện mcrypt hỗ trợ mã hóa vàgiải mã dữ liệu

Tổng kết bài học

Bài 4 - Bảo mật cho website 44