STDIO
Tìm kiếm gần đây

    Nội dung

    Mã Hóa Base64

    Võ Lê Huy

    19/10/2019
    03/07/2020
    Mã Hóa Base64
    Base64 không phải là một thuật toán mã hóa và trong mọi trường hợp, nó không nên được sử dụng để băm mật khẩu hoặc dữ liệu nhạy cảm, bởi vì đây là thuật toán có thể được dịch ngược, dữ liệu được mã hóa có thể dễ dàng được giải mã.

    Vào năm 1993, John Linn công bố thuật toán mã hóa Base64 trong tài liệu chuẩn: RFC 1421 - Privacy Enhancement for Internet Electronic Mail: Part I: Message Encryption and Authentication Procedures. Tạm dịch: Tăng cường bảo mật thư điện tử: Phần I: Xác thực và mã hóa thông điệp.

    Sau đó, nó đã được sửa đổi đôi chút vào tháng 9 năm 1993 bởi N. Borenstein trong phần: RFC 1521 - MIME (Multipurpose Internet Mail Extensions) Part I: Mechanisms for Specifying and Describing the Format of Internet Message Bodies.

    Lịch sử của Base64 bắt đầu vào thời điểm khi các kỹ sư tranh luận có bao nhiêu bit trong một byte. Bây giờ chúng ta sử dụng một byte với tám bit, nhưng trước đó đã được sử dụng một byte bảy bit, sáu bit và thậm chí ba bit bởi vì tất cả các hệ thống lớn vào lúc đó đã tự định nghĩa, giao ước với nhau, cho đến ngày nay kỹ sư làm việc của một hệ thống lớn cũng có thể tự quy định một byte với bao nhiêu bít tùy vào hoàn cảnh họ muốn và đảm bảo sự ổn định của hệ thống. Vào thời điểm mã hóa tám bit được công bố là một tiêu chuẩn, nhiều hệ thống đã sử dụng các tiêu chuẩn cũ và không hỗ trợ tiêu chuẩn mới. Điều này dẫn đến thực tế là một số dữ liệu đã bị mất trong quá trình chuyển đổi giữa hệ thống mới và hệ thống cũ. Ví dụ, một máy chủ thư điện tử có thể loại bỏ bit thứ tám khi gửi mail, điều này là hoàn toàn không thể chấp nhận. Hơn nữa, có một vấn đề khác với các máy chủ thư điện tử là họ chỉ có thể gửi văn bản chứ không thể gửi dữ liệu nhị phân như: hình ảnh, video nói chung và tệp tin đa phương tiện nói riêng. Và vì vậy thuật toán Base64 được sinh ra để giải quyết những vấn đề này. Tất nhiên, theo thời gian, các bảng mã khác được phát triển, nhưng nhờ sự đơn giản và hiệu quả Base64 trở nên phổ biến nhất và được sử dụng ở hầu hết mọi nơi.

    # CHAR # CHAR # CHAR # CHAR
    0 A 16 Q 32 g 48 w
    1 B 17 R 33 h 49 x
    2 C 18 S 34 i 50 y
    3 D 19 T 35 j 51 z
    4 E 20 U 36 k 52 0
    5 F 21 V 37 l 53 1
    6 G 22 W 38 m 54 2
    7 H 23 X 39 n 55 3
    8 I 24 Y 40 o 56 4
    9 J 25 Z 41 p 57 5
    10 K 26 a 42 q 58 6
    11 L 27 b 43 r 59 7
    12 M 28 c 44 s 60 8
    13 N 29 d 45 t 61 9
    14 O 30 e 46 u 62 +
    15 P 31 f 47 v 63 /

    Vì thuật toán này sử dụng 64 ký tự cơ bản, không khó để đặt tên cho nó. Do đó sẽ không có vấn đề gì khi chúng ta đoán tên của các thuật toán như Base16, Base32, Base36, Base58, Base91 hoặc Base122.

    Nhược điểm

    Trong quá trình mã hóa, thuật toán Base64 thay thế mỗi ba byte bằng bốn byte và nếu cần thiết sẽ thêm các ký tự đệm, do đó, kết quả sẽ luôn là bội số của bốn. Nói một cách đơn giản, kích thước của kết quả sẽ luôn lớn hơn 33% (chính xác hơn là 4⁄3) so với dữ liệu gốc.

    Số lượng bytes cần mã hóa tức số lượng byte đầu vào không chia hết cho 3 (Điều này có nghĩa là chỉ có 1 hoặc 2 bytes trong 24 bits mã hóa cuối cùng). Chúng ta sẽ thêm các bit 0 vào cuối cho đủ 24 bit, thực hiện mã hóa Base64, ngoại trừ những bytes gồm toàn bit 0 thì sẽ thay bằng kí tự ‘=’

    Ứng dụng

    Để hiểu theo nghĩa bóng tại sao Base64 được phát minh, hãy tưởng tượng rằng trong một cuộc gọi điện thoại, Alice muốn gửi một hình ảnh cho Bob. Vấn đề đầu tiên là cô ấy không thể mô tả đơn giản hình ảnh trông như thế nào, bởi vì Bob cần một bản sao chính xác. Trong trường hợp này, Alice có thể chuyển đổi hình ảnh thành hệ thống nhị phân và ra lệnh cho Bob các chữ số nhị phân (bit), sau đó anh ta sẽ có thể chuyển đổi chúng trở lại hình ảnh gốc. Vấn đề thứ hai là giá cước cho các cuộc gọi điện thoại quá đắt và chỉ ra mỗi byte là 8 chữ số nhị phân sẽ kéo dài quá lâu. Để giảm chi phí, Alice và Bob đồng ý sử dụng phương thức truyền dữ liệu hiệu quả hơn bằng cách sử dụng một bảng chữ cái đặc biệt, thay thế cho mỗi sáu ký số của Cameron bằng chữ cái.

    Để nhận ra sự khác biệt, hãy xem hình ảnh màu đỏ có 3 kênh màu rgb: 3x3 = 3 pixel x 3 pixel x 3 byte = 27 byte được chuyển đổi thành chữ số nhị phân:

    11111111000000000000 11111111000000000000 11111111000000000000
    11111111000000000000 11111111000000000000 11111111000000000000
    11111111000000000000 11111111000000000000 11111111000000000000

    Hình ảnh được chuyển đổi thành Base64:

    /AA/AA/AA/AA/AA/AA/AA/AA/AAA

    Sử dụng

    Base64 được sử dụng phổ biến nhất để mã hóa dữ liệu nhị phân, ví dụ: hình ảnh hoặc tệp âm thanh, … để nhúng vào HTML, CSS, EML và các tài liệu văn bản khác. Ngoài ra, Base64 được sử dụng để mã hóa dữ liệu có thể không được hỗ trợ hoặc bị hỏng trong quá trình truyền, lưu trữ.

    Bảo vệ

    Base64 không phải là một thuật toán mã hóa và trong mọi trường hợp, nó không nên được sử dụng để băm mật khẩu hoặc dữ liệu nhạy cảm, bởi vì đây là thuật toán có thể được dịch ngược, dữ liệu được mã hóa có thể dễ dàng được giải mã.

    Ví dụ một cách đơn giản, về mặt bảo mật thông tin, Base64 chỉ là một ngôn ngữ nước ngoài mà một số người trong nước không hiểu. Tuy nhiên, thậm chí họ có thể hiểu ý nghĩa của tin nhắn được mã hóa chỉ bằng cách sử dụng “google translate” trực tuyến, ngay lập tức họ nhận được thông điệp gốc.

    Ví dụ

    Chuyển đổi thông điệp ABC thông qua thuật toán Base64 ta có chuỗi kết quả QUJD

    Input A B C
    ASCII 65 66 67
    Encode
    Base64
    0 1 0 0 0 0 0 1 0 1 0 0 0 0 1 0 0 1 0 0 0 0 1 1
    16 20 9 3
    Output Q U J D

    Giới thiệu công cụ

    Bạn có thể kiểm tra lại kết quả trên với công cụ mã hóa, giải mã Base64 online tại đây.

    Bugs

    Chuyện của những nhà phát triển.

    Thảo luận

    In order to comment you must be a STDIO Insider. Please sign up or log in to continue.

    Đăng nhập

    Bài viết liên quan

    Cơ Bản Về Mã Hóa

    Cơ Bản Về Mã Hóa

    Giả sử con người chưa biết đến mã hóa, một hacker chỉ cần làm một thiết bị lắng nghe và chuyển đổi các gói packet được truyền đi trong mạng và gắng thiết bị này vào cáp ...

    Hoàng Tiến Đạt

    03/12/2014

    Đồ Hoạ Trên Cửa Sổ Dòng Lệnh - Console Graphics

    Đồ Hoạ Trên Cửa Sổ Dòng Lệnh - Console Graphics

    Các thư viện đồ họa đã phát triển rất mạnh mẽ, tận dụng gần như tối đa sức mạnh của phần cứng đồ họa nên đồ họa trên cửa sổ dòng lệnh dần bị rơi vào quên lãng. Nhưng ...

    Vũ Quang Huy

    02/10/2014

    Khởi Tạo Môi Trường Lập Trình Đồ Họa OpenGL Trên Windows Với GLEW Và GLFW3

    Khởi Tạo Môi Trường Lập Trình Đồ Họa OpenGL Trên Windows Với GLEW Và GLFW3

    OpenGL (Open Graphics Library) là một trong những thư viện đồ họa phổ biến nhất trên thế giới, được giới thiệu lần đầu tiên vào năm 1991. OpenGL bao gồm một hệ thống các ...

    Vũ Quang Huy

    28/09/2014

    Một Số Hàm Xử Lý Đồ Hoạ Trong PHP

    Một Số Hàm Xử Lý Đồ Hoạ Trong PHP

    Ngày nay, nhu cầu về sử dụng đồ hoạ đang bùng nổ rất mạnh mẽ, kéo theo sự phát triển của các thư viện đồ hoạ trong những năm gần đây. Bài viết ra đời, nhằm cung cấp đến ...

    Ryan Lê

    30/03/2015

    Xử Lý Unicode - UTF-8

    Xử Lý Unicode - UTF-8

    Giới thiệu về Unicode UTF-8, cách thức mã hóa và giải mã UTF-8.

    La Kiến Vinh

    17/09/2014

    Xử Lý Unicode - UTF-16

    Xử Lý Unicode - UTF-16

    Giới thiệu về Unicode UTF-16, cách thức mã hóa và giải mã UTF-16.

    La Kiến Vinh

    02/06/2014

    Sự Thật Về Web Design Và Graphic Design

    Sự Thật Về Web Design Và Graphic Design

    Web Design thường được hiểu nghĩa tiếng Việt đó là thiết kế web, Graphic Design thì được hiểu là thiết kế đồ họa. Khi đề cập tới Web Design, hiện nay đa phần mọi người ...

    STDIO SolutionsThiết kế

    07/06/2017

    Tối Ưu Mã C/C++ Cho Người Mới Bắt Đầu

    Tối Ưu Mã C/C++ Cho Người Mới Bắt Đầu

    Xuất phát từ vấn đề đánh giá tiêu chuẩn một sản phẩm do một người lập trình làm ra, điều quan trọng không kém đó chính là tốc độ xử lí và kích thước của một chương trình. ...

    Trần Minh Cường

    28/08/2015

    Tư Duy Tối Ưu Hóa Trong Lập Trình Games - Phần 1: Codes Trong C/C++

    Tư Duy Tối Ưu Hóa Trong Lập Trình Games - Phần 1: Codes Trong C/C++

    Bài viết hướng tối ưu hóa trong lập trình với C++, tối ưu hóa lập trình C++ với games, bài viết hướng games bởi vì games đòi hỏi hiệu năng rất cao, và các games lớn thông ...

    La Kiến Vinh

    18/09/2014

    Bảng Mã ASCII

    Bảng Mã ASCII

    Giới thiệu bảng mã ASCII, bảng tham khảo các ký tự mã hóa ASCII và ASCII mở rộng.

    Hiếu Nguyễn

    23/11/2014

    STDIO
    Trang chính
    Công ty TNHH STDIO

    30, Trịnh Đình Thảo, Hòa Thạnh, Tân Phú, Hồ Chí Minh
    +84 28.36205514 - +84 942.111912
    developer@stdio.vn

    383/1 Quang Trung, Phường 10, Quận Gò Vấp, Hồ Chí Minh
    Số giấy phép ĐKKD: 0311563559 do sở Kế hoạch và Đầu Tư TPHCM cấp ngày 23/02/2012

    ©STDIO, 2013 - 2020