Chad Smith là Lập trình viên cao cấp của OmniPrepaid LLC có trụ sở tại Pittsburgh, PA. Anh ấy có niềm đam mê với phát triển UX, API, jQuery, CSS, PHP và Symfony2/Doctrine. … Thông tin thêm về Chad Smith ↬
Bản tin email
Email [đập vỡ] của bạn
Mẹo hàng tuần về front-end & UX
Được hơn 200.000 người tin cậy
- Quảng cáo trên tạp chí Smashing
- Hệ thống thiết kế thành công
- Chuẩn bị cho các vai trò giao tiếp ngày nay Thạc sĩ Thiết kế Thông tin của Northwestern
- Giao diện người dùng SmashingConf 2023
- Lớp học tổng thể về nguyên tắc phổ quát của kiểu chữ với Elliot Jay Stocks
1 và new_key = new_key ^ hijklmnopqrstuvw
new_key = 123456789abcdefg ^ hijklmnopqrstuvw
new_key = Y[Y_Y[YWI
2 bằng ngôn ngữ PHPnew_key = new_key ^ hijklmnopqrstuvw
new_key = 123456789abcdefg ^ hijklmnopqrstuvw
new_key = Y[Y_Y[YWI
Tại công ty chúng tôi, chúng tôi xử lý rất nhiều yêu cầu trên các trang web thẻ quà tặng và phiếu giảm giá hàng đầu trên thế giới. Các nhà phát triển cấp cao đã có một cuộc họp vào cuối tháng 10 để thảo luận về giải pháp sao chép các chức năng MySQL của
new_key = new_key ^ hijklmnopqrstuvw
new_key = 123456789abcdefg ^ hijklmnopqrstuvw
new_key = Y[Y_Y[YWI
1 và new_key = new_key ^ hijklmnopqrstuvw
new_key = 123456789abcdefg ^ hijklmnopqrstuvw
new_key = Y[Y_Y[YWI
2 bằng ngôn ngữ PHP. Bài viết này tập trung vào những gì được sản xuất bởi nhà phát triển cao cấp Derek Woods và cách sử dụng nó trong các ứng dụng của riêng bạnBảo mật phải được đặt lên hàng đầu trong tâm trí của mọi nhà phát triển khi xây dựng một ứng dụng có thể chứa dữ liệu nhạy cảm. Chúng tôi muốn sao chép các chức năng của MySQL vì rất nhiều dữ liệu của chúng tôi đã được mã hóa AES trong cơ sở dữ liệu của chúng tôi và nếu bạn giống chúng tôi, bạn có thể cũng có dữ liệu đó
Đọc thêm trên SmashingMag.
- HTTPS ở mọi nơi với Nginx, Varnish và Apache
- Quy trình làm việc đơn giản từ phát triển đến triển khai
- Tăng tốc cơ sở dữ liệu trang web của bạn
- Tại sao trình tạo trang web tĩnh là điều quan trọng tiếp theo
Tại sao mã hóa lại quan trọng?
Chúng tôi sẽ bắt đầu bằng cách xem xét lý do tại sao bảo mật và mã hóa lại quan trọng ở tất cả các cấp của ứng dụng. Mọi ứng dụng, dù lớn hay nhỏ, đều cần một số hình thức bảo mật và mã hóa. Bất kỳ dữ liệu người dùng nào bạn có đều cực kỳ có giá trị đối với các tin tặc tiềm năng và cần được bảo vệ. Mã hóa cơ bản nên được sử dụng khi ứng dụng của bạn lưu trữ mật khẩu hoặc một số dạng thông tin nhận dạng khác
Thêm sau khi nhảy. Tiếp tục đọc bên dưới ↓
Gặp gỡ Tối ưu hóa hình ảnh, hướng dẫn thực tế hoàn toàn mới của Addy Osmani để tối ưu hóa và cung cấp hình ảnh chất lượng cao trên web. Từ định dạng và nén đến phân phối và bảo trì. mọi thứ trong một cuốn sách dày 528 trang
Chuyển đến mục lục ↬Các mức dữ liệu nhạy cảm khác nhau yêu cầu các thuật toán mã hóa khác nhau. Việc biết mức độ sử dụng có thể được xác định bằng cách trả lời câu hỏi cơ bản, "Liệu tôi có cần truy cập vào dữ liệu gốc sau khi dữ liệu đã được mã hóa không?" . Khi lưu trữ dữ liệu nhạy cảm khác cần được trả về đầu vào ban đầu, bạn sẽ không thể sử dụng thuật toán băm một chiều, chẳng hạn như MD5;
Mã hóa chỉ mạnh bằng khóa được sử dụng để bảo vệ nó. Hãy tưởng tượng rằng kẻ tấn công vi phạm tường lửa của bạn và có một bản sao chính xác cơ sở dữ liệu của bạn; . Giữ chìa khóa ở nơi an toàn phải luôn là ưu tiên số một. Nhiều người sử dụng tệp
new_key = new_key ^ hijklmnopqrstuvw
new_key = 123456789abcdefg ^ hijklmnopqrstuvw
new_key = Y[Y_Y[YWI
5 được đọc trong thời gian chạy và không thể truy cập công khai trong phạm vi của máy chủ Web. Nếu ứng dụng của bạn yêu cầu mã hóa hai chiều, thì có các tiêu chuẩn ngành để bảo vệ dữ liệu đó, một là mã hóa AESMã hóa AES là gì?
AES, viết tắt của Advanced Encryption Standard, được phát triển bởi Joan Daemen và Vincent Rijmen. Họ đặt tên cho mật mã của mình là Rijndael, sau khi chơi chữ hai tên của họ. AES được công bố là người chiến thắng trong cuộc thi kéo dài 5 năm do Viện Tiêu chuẩn và Công nghệ Quốc gia [NIST] tiến hành vào ngày 26 tháng 11 năm 2001
AES là cơ chế mã hóa và giải mã hai chiều, cung cấp một lớp bảo mật cho dữ liệu nhạy cảm trong khi vẫn cho phép truy xuất dữ liệu gốc. Để làm điều này, nó sử dụng khóa mã hóa được sử dụng làm hạt giống trong thuật toán AES. Miễn là khóa vẫn giữ nguyên, dữ liệu gốc có thể được giải mã. Điều này là cần thiết nếu dữ liệu nhạy cảm của bạn cần được trả về trạng thái ban đầu
Làm thế nào nó hoạt động?
AES sử dụng một thuật toán toán học phức tạp mà chúng ta sẽ khám phá sau, để kết hợp hai khái niệm chính. nhầm lẫn và khuếch tán. Nhầm lẫn là một quá trình che giấu mối quan hệ giữa dữ liệu gốc và kết quả được mã hóa. Một ví dụ cổ điển về điều này là Mật mã Caesar, áp dụng một phép dịch chuyển đơn giản các chữ cái để A trở thành C, B trở thành D, v.v. Truyền bá là một quá trình thay đổi, điều chỉnh hoặc thay đổi dữ liệu theo những cách phức tạp. Điều này có thể được thực hiện bằng cách sử dụng dịch chuyển bit, thay thế, bổ sung, thao tác ma trận, v.v. Sự kết hợp của hai phương pháp này cung cấp lớp bảo mật mà AES cần để cung cấp cho chúng tôi thuật toán bảo mật cho dữ liệu của chúng tôi
Để có tính hai chiều, quá trình nhầm lẫn và phổ biến được quản lý bằng khóa bí mật mà chúng tôi cung cấp cho AES. Chạy thuật toán theo một hướng với một khóa và dữ liệu sẽ xuất ra một chuỗi bị xáo trộn, do đó mã hóa dữ liệu. Bằng cách chuyển chuỗi đó trở lại thuật toán với cùng một khóa, chạy thuật toán ngược lại sẽ xuất dữ liệu gốc. Thay vì cố gắng giữ bí mật thuật toán, thuật toán AES dựa vào bí mật khóa hoàn toàn. Theo đó, OWASP khuyên bạn nên xoay khóa từ một đến ba năm một lần. Các hướng dẫn cũng đi qua các phương pháp xoay phím AES
Chi tiết cụ thể về PHP Mcrypt
PHP cung cấp triển khai AES thông qua tiện ích mở rộng Mcrypt, tiện ích này cũng cung cấp cho chúng tôi một số mật mã khác. Ngoài bản thân thuật toán, Mcrypt còn cung cấp nhiều chế độ thay đổi mức độ bảo mật của thuật toán AES để làm cho nó an toàn hơn. Hai định nghĩa mà chúng ta sẽ cần sử dụng trong các hàm PHP của mình là
new_key = new_key ^ hijklmnopqrstuvw
new_key = 123456789abcdefg ^ hijklmnopqrstuvw
new_key = Y[Y_Y[YWI
6 và new_key = new_key ^ hijklmnopqrstuvw
new_key = 123456789abcdefg ^ hijklmnopqrstuvw
new_key = Y[Y_Y[YWI
7. Rijndael 256 là mật mã mã hóa mà chúng tôi sẽ sử dụng để mã hóa AES của mình. Ngoài ra, mã này sử dụng “Sổ mã điện tử” để phân đoạn dữ liệu thành các khối và mã hóa chúng một cách riêng biệt. Có sẵn các chế độ thay thế và an toàn hơn, nhưng MySQL sử dụng ECB theo mặc định, vì vậy chúng tôi sẽ xây dựng triển khai PHP xung quanh đóTại sao bạn nên tránh AES trong MySQL?
Sử dụng chức năng mã hóa và giải mã AES của MySQL rất đơn giản. Quá trình thiết lập đòi hỏi ít công việc hơn và nhìn chung dễ hiểu hơn nhiều. Ngoài lợi ích rõ ràng của sự đơn giản, có ba lý do chính khiến Mcrypt của PHP vượt trội hơn các chức năng AES của MySQL
- MySQL cần một liên kết cơ sở dữ liệu giữa ứng dụng và cơ sở dữ liệu để mã hóa và giải mã xảy ra. Điều này có thể dẫn đến các vấn đề về khả năng mở rộng không cần thiết và các lỗi nghiêm trọng nếu cơ sở dữ liệu gặp lỗi nội bộ, do đó khiến ứng dụng của bạn không sử dụng được
- PHP có thể thực hiện giải mã và mã hóa MySQL tương tự với một số nỗ lực nhưng không cần kết nối cơ sở dữ liệu, giúp cải thiện tốc độ và hiệu quả của ứng dụng
- MySQL thường ghi lại các giao dịch, vì vậy nếu máy chủ của cơ sở dữ liệu đã bị xâm phạm, thì tệp nhật ký sẽ tạo ra cả khóa mã hóa và giá trị ban đầu
Sửa đổi khóa AES của MySQL
Rất tiếc, các chức năng Mcrypt của PHP không cung cấp các chuỗi được mã hóa khớp với các chuỗi của MySQL. Có một vài lý do cho điều này, nhưng nguyên nhân gốc rễ của sự khác biệt là cách mà MySQL xử lý cả khóa và đầu vào. Để hiểu nguyên nhân, chúng ta phải đi sâu vào thuật toán mã hóa AES mặc định của MySQL. Các đoạn mã được trình bày bên dưới đã được thử nghiệm lên phiên bản mới nhất của MySQL, nhưng MySQL có thể thay đổi sơ đồ mã hóa của chúng. Vấn đề đầu tiên mà chúng tôi gặp phải là MySQL sẽ chia khóa bí mật của chúng tôi thành các khối 16 byte và XOR các ký tự với nhau từ trái sang phải. XOR là một sự phân tách độc quyền và nếu hai byte giống nhau, thì đầu ra là
new_key = new_key ^ hijklmnopqrstuvw
new_key = 123456789abcdefg ^ hijklmnopqrstuvw
new_key = Y[Y_Y[YWI
8; . Ngoài ra, nó bắt đầu bằng một khối ký tự null 16 byte, vì vậy nếu chúng ta chuyển vào khóa có ít hơn 16 byte, thì phần còn lại của khóa sẽ chứa ký tự nullGiả sử chúng tôi có khóa 34 ký tự.
new_key = new_key ^ xy
new_key = Y[Y_Y[YWI ^ xy
new_key = !"Y_Y[YWI
0. MySQL sẽ bắt đầu với 16 ký tự đầu tiênnew_key = 123456789abcdefg
Bước thứ hai được thực hiện là XOR [⊕] 16 ký tự tiếp theo trong giá trị trong
new_key = new_key ^ xy
new_key = Y[Y_Y[YWI ^ xy
new_key = !"Y_Y[YWI
1 với 16 ký tự đầu tiênnew_key = new_key ^ hijklmnopqrstuvw
new_key = 123456789abcdefg ^ hijklmnopqrstuvw
new_key = Y[Y_Y[YWI
Cuối cùng, hai ký tự còn lại sẽ được XOR'd bắt đầu từ bên trái
new_key = new_key ^ xy
new_key = Y[Y_Y[YWI ^ xy
new_key = !"Y_Y[YWI
Tất nhiên, điều này khác rất nhiều so với khóa ban đầu của chúng ta, vì vậy nếu quá trình này không diễn ra, thì giá trị trả về từ các hàm giải mã/mã hóa sẽ không chính xác
Đệm phím
Sự khác biệt lớn thứ hai giữa Mcrypt PHP và MySQL là độ dài của giá trị Mcrypt phải có phần đệm để đảm bảo nó là bội số của 16 byte. Có nhiều cách để thực hiện việc này, nhưng tiêu chuẩn là đệm khóa có giá trị byte bằng với số byte còn lại. Vì vậy, nếu giá trị của chúng tôi là 34 ký tự, thì chúng tôi sẽ đệm với giá trị byte là 14
Để tính toán điều này, chúng tôi sử dụng công thức sau
$pad_value = 16-[strlen[$value] % 16];
Sử dụng ví dụ 34 ký tự của chúng tôi, chúng tôi sẽ kết thúc với điều này
$pad_value = 16-[strlen["123456789abcdefghijklmnopqrstuvwxy"] % 16];
$pad_value = 16-[34 % 16];
$pad_value = 16-[2];
$pad_value = 14;
Chức năng chính của MySQL
Trong phần trước, chúng ta đã đi sâu vào các vấn đề xoay quanh khóa MySQL dùng để mã hóa và giải mã. Dưới đây là chức năng được sử dụng trong cả chức năng mã hóa và giải mã của chúng tôi
function mysql_aes_key[$key]
{
$new_key = str_repeat[chr[0], 16];
for[$i=0,$len=strlen[$key];$iUser->aes_encrypt['test'];
echo base64_encode[$a].'
';
$result = $this->User->query["SELECT AES_ENCRYPT['test', '".MY_KEY."'] AS enc"];
$b = $result[0][0]['enc'];
echo base64_encode[$b].'
';
// Group 2
$result = $this->User->query["SELECT AES_DECRYPT['".$a."', '".MY_KEY."'] AS decc"];
$c = $result[0][0]['decc'];
echo $c."
";
$d = $this->User->aes_decrypt[$b];
echo $d."
";
// Comparison
var_dump[$a===$b];
var_dump[$c===$d];
đầu ra
Đoạn mã bên dưới là kết quả khi bạn chạy các lệnh PHP được liệt kê ở trên
new_key = new_key ^ hijklmnopqrstuvw
new_key = 123456789abcdefg ^ hijklmnopqrstuvw
new_key = Y[Y_Y[YWI
0Suy nghĩ cuối cùng
Mã hóa AES có thể hơi khó khăn nếu bạn không quen thuộc với các chi tiết cụ thể của thuật toán hoặc quen thuộc với bất kỳ sự khác biệt nào giữa các triển khai mà bạn có thể phải làm việc với các thư viện và gói phần mềm khác nhau của mình. Như bạn có thể thấy, thực sự có thể sử dụng các hàm PHP gốc để xử lý mã hóa và giải mã và thực sự làm cho nó hoạt động liền mạch với bất kỳ dữ liệu được mã hóa chỉ MySQL kế thừa nào mà ứng dụng của bạn có thể có. Các phương pháp này nên được sử dụng bất kể để bạn có thể sử dụng MySQL để giải mã dữ liệu nếu một kịch bản phát sinh trong đó đó là tùy chọn duy nhất