Tôi đã nghe mọi người nói về "mã hóa cơ sở 64" ở đây và đó. Cái này được dùng để làm gì?
Tôi đã nghe mọi người nói về "mã hóa cơ sở 64" ở đây và đó. Cái này được dùng để làm gì?
Câu trả lời:
Khi bạn có một số dữ liệu nhị phân mà bạn muốn gửi qua mạng, bạn thường không làm điều đó bằng cách chỉ truyền các bit và byte qua dây ở định dạng thô. Tại sao? bởi vì một số phương tiện truyền thông được thực hiện để truyền phát văn bản. Bạn không bao giờ biết - một số giao thức có thể hiểu dữ liệu nhị phân của bạn là ký tự điều khiển (như modem) hoặc dữ liệu nhị phân của bạn có thể bị sai lệch vì giao thức cơ bản có thể nghĩ rằng bạn đã nhập một tổ hợp ký tự đặc biệt (như cách FTP dịch dòng kết thúc).
Vì vậy, để giải quyết vấn đề này, mọi người mã hóa dữ liệu nhị phân thành các ký tự. Base64 là một trong những loại mã hóa.
Tại sao 64?
Bởi vì bạn thường có thể dựa vào cùng 64 ký tự có mặt trong nhiều bộ ký tự và bạn có thể tin tưởng một cách hợp lý rằng dữ liệu của bạn sẽ kết thúc ở phía bên kia của dây không bị lỗi.
Về cơ bản, đây là cách mã hóa dữ liệu nhị phân tùy ý trong văn bản ASCII. Phải mất 4 ký tự cho mỗi 3 byte dữ liệu, cộng với khả năng có một chút phần đệm ở cuối.
Về cơ bản, mỗi 6 bit của đầu vào được mã hóa trong bảng chữ cái 64 ký tự. Bảng chữ cái "tiêu chuẩn" sử dụng AZ, az, 0-9 và + và /, với = làm ký tự đệm. Có các biến thể an toàn URL.
Wikipedia là một nguồn hợp lý tốt của nhiều thông tin hơn.
binary strings
. (nguồn) php.net/manual/en/function.pack.php
Mã hóa Base-64 là cách lấy dữ liệu nhị phân và biến nó thành văn bản để nó dễ dàng được truyền đi trong những thứ như e-mail và dữ liệu biểu mẫu HTML.
Đó là mã hóa văn bản của dữ liệu nhị phân trong đó văn bản kết quả không có gì ngoài chữ cái, số và ký hiệu "+", "/" và "=". Đó là một cách thuận tiện để lưu trữ / truyền dữ liệu nhị phân trên phương tiện được sử dụng riêng cho dữ liệu văn bản.
Nhưng tại sao Base-64? Hai lựa chọn thay thế để chuyển đổi dữ liệu nhị phân thành văn bản ngay lập tức nảy ra trong đầu là:
Base-64 ánh xạ 3 byte (8 x 3 = 24 bit) thành 4 ký tự trải dài 6 bit (6 x 4 = 24 bit). Kết quả trông giống như "TWFuIGlzIGRpc3Rpb ...". Do đó, tỷ lệ đầy hơi chỉ bằng 4/3 = 1,3333333 lần so với ban đầu.
Ngoài những gì đã được nói, hai cách sử dụng rất phổ biến chưa được liệt kê là
Băm:
Băm là các hàm một chiều biến đổi một khối byte thành một khối byte khác có kích thước cố định, chẳng hạn như 128bit hoặc 256bit (SHA / MD5). Chuyển đổi các byte kết quả thành Base64 giúp hiển thị hàm băm dễ dàng hơn nhiều, đặc biệt khi bạn so sánh tổng kiểm tra tính toàn vẹn. Băm thường được thấy trong Base64 đến nỗi nhiều người nhầm chính Base64 là một hàm băm.
Mật mã:
Vì khóa mã hóa không phải là văn bản mà là byte thô, đôi khi cần phải lưu trữ nó trong một tệp hoặc cơ sở dữ liệu, mà Base64 có ích. Tương tự với các byte được mã hóa kết quả.
Lưu ý rằng mặc dù Base64 thường được sử dụng trong mật mã không phải là một cơ chế bảo mật. Bất cứ ai cũng có thể chuyển đổi chuỗi Base64 trở lại các byte ban đầu của nó, vì vậy không nên sử dụng nó như một phương tiện để bảo vệ dữ liệu, chỉ như một định dạng để hiển thị hoặc lưu trữ các byte thô dễ dàng hơn.
Giấy chứng nhận
Chứng chỉ x509 ở định dạng PEM được mã hóa cơ sở 64. http://how2ssl.com/articles/usiness_with_pem_files/
Nhiều năm trước, khi chức năng gửi thư được giới thiệu, do đó, hoàn toàn dựa trên văn bản, khi thời gian trôi qua, cần có các tệp đính kèm như hình ảnh và phương tiện (âm thanh, video, v.v.) ra đời. Khi các tệp đính kèm này được gửi qua internet (về cơ bản ở dạng dữ liệu nhị phân), xác suất dữ liệu nhị phân bị hỏng rất cao ở dạng thô. Vì vậy, để giải quyết vấn đề này, BASE64 đã xuất hiện.
Vấn đề với dữ liệu nhị phân là nó chứa các ký tự null, trong một số ngôn ngữ như C, C ++ đại diện cho phần cuối của chuỗi ký tự, vì vậy việc gửi dữ liệu nhị phân ở dạng thô chứa byte NULL sẽ ngăn không cho tệp được đọc và dẫn hoàn toàn vào dữ liệu bị hỏng.
Ví dụ :
Trong C và C ++, ký tự "null" này hiển thị phần cuối của chuỗi. Vì vậy, "HELLO" được lưu trữ như thế này:
XIN CHÀO
72 69 76 76 79 00
00 nói "dừng ở đây".
Bây giờ hãy đi sâu vào cách mã hóa BASE64 hoạt động.
Điểm cần lưu ý: Độ dài của chuỗi phải là bội số của 3.
Ví dụ 1 :
Chuỗi được mã hóa: Số lượt truy cập, chiều dài = 3
1) Chuyển đổi từng ký tự thành số thập phân.
a = 97, c = 99, e = 101
2) Thay đổi mỗi đại diện nhị phân thành 8 bit.
97 = 01100001, 99 = 01100011, 101 = 01100101
Kết hợp: 01100001 01100011 01100101
3) Phân chia trong một nhóm 6 bit.
011000 010110 001101 100101
4) Tính nhị phân thành số thập phân
011000 = 24, 010110 = 22, 001101 = 13, 100101 = 37
5) Chuyển đổi các ký tự thập phân thành base64 bằng biểu đồ base64.
24 = Y, 22 = W, 13 = N, 37 = l
Một lần nữa
Ví dụ 2:
Chuỗi được mã hóa: Thời gian abcd tối giản = 4, không phải là bội số của 3. Vì vậy, để tạo độ dài chuỗi bội số của 3, chúng ta phải thêm phần đệm 2 bit để tạo độ dài = 6. Bit đệm được biểu thị bằng dấu = =.
Điểm cần lưu ý: Một bit đệm bằng hai số 0 nên hai bit đệm bằng bốn số 0 0000.
Vì vậy, hãy bắt đầu quá trình: -
1) Chuyển đổi từng ký tự thành số thập phân.
a = 97, b = 98, c = 99, d = 100
2) Thay đổi mỗi đại diện nhị phân thành 8 bit.
97 = 01100001, 98 = 01100010, 99 = 01100011, 100 = 01100100
3) Tách riêng trong một nhóm 6 bit.
011000, 010110, 001001, 100011, 011001, 00
Vì vậy, 6 bit cuối cùng không hoàn thành, vì vậy chúng tôi chèn hai bit đệm bằng bốn số 0 0000 00.
011000, 010110, 001001, 100011, 011001, 000000 ==
Bây giờ, nó là bằng nhau. Hai dấu bằng ở cuối cho thấy 4 số 0 đã được thêm vào (giúp giải mã).
4) Tính nhị phân thành thập phân.
011000 = 24, 010110 = 22, 001001 = 9, 100011 = 35, 011001 = 25, 000000 = 0 == =
5) Chuyển đổi các ký tự thập phân thành base64 bằng biểu đồ base64.
24 = Y, 22 = W, 9 = j, 35 = j, 25 = Z, 0 = A ==
Tiếng vang abcd đỉnh => YDJjZA ==
Trong thời kỳ đầu của máy tính, khi giao tiếp giữa các hệ thống điện thoại không đặc biệt đáng tin cậy, một phương pháp nhanh chóng và bẩn để xác minh tính toàn vẹn dữ liệu đã được sử dụng: "bit parity". Trong phương pháp này, mỗi byte được truyền sẽ có 7 bit dữ liệu và số 8 sẽ là 1 hoặc 0, để buộc tổng số 1 bit trong byte là chẵn.
Do đó 0x01 sẽ được truyền thành 0x81; 0x02 sẽ là 0x82; 0x03 sẽ vẫn là 0x03, v.v.
Để tiếp tục hệ thống này, khi bộ ký tự ASCII được xác định, chỉ 00-7F được gán các ký tự. (Vẫn như ngày nay, tất cả các ký tự được đặt trong phạm vi 80-FF đều không chuẩn)
Nhiều bộ định tuyến trong ngày đưa kiểm tra chẵn lẻ và dịch byte vào phần cứng, buộc các máy tính gắn liền với chúng phải xử lý nghiêm ngặt dữ liệu 7 bit. Điều này buộc các tệp đính kèm email (và tất cả các dữ liệu khác, đó là lý do tại sao các giao thức HTTP & SMTP dựa trên văn bản), được chuyển đổi thành định dạng chỉ có văn bản.
Rất ít các bộ định tuyến tồn tại vào những năm 90. Tôi hoàn toàn nghi ngờ bất kỳ ai trong số họ đang sử dụng ngày hôm nay.
Từ http://en.wikipedia.org/wiki/Base64
Thuật ngữ Base64 dùng để chỉ một mã hóa chuyển nội dung MIME cụ thể. Nó cũng được sử dụng như một thuật ngữ chung cho bất kỳ sơ đồ mã hóa tương tự nào mã hóa dữ liệu nhị phân bằng cách xử lý nó bằng số và dịch nó thành biểu diễn cơ sở 64. Sự lựa chọn đặc biệt của cơ sở là do lịch sử mã hóa bộ ký tự: người ta có thể chọn một bộ gồm 64 ký tự là cả một phần của tập hợp con phổ biến cho hầu hết các mã hóa và cũng có thể in được. Sự kết hợp này khiến dữ liệu khó có thể được sửa đổi trong quá trình chuyển qua các hệ thống, chẳng hạn như email, theo truyền thống không sạch 8 bit.
Base64 có thể được sử dụng trong nhiều bối cảnh:
- Evolution và Thunderbird sử dụng Base64 để làm xáo trộn mật khẩu email [1]
- Base64 có thể được sử dụng để truyền và lưu trữ văn bản có thể gây ra xung đột dấu phân cách
Base64 thường được sử dụng như một lối tắt nhanh chóng nhưng không an toàn để che giấu các bí mật mà không làm phát sinh chi phí quản lý khóa mật mã
Kẻ gửi thư rác sử dụng Base64 để trốn tránh các công cụ chống spam cơ bản, thường không giải mã Base64 và do đó không thể phát hiện từ khóa trong tin nhắn được mã hóa.
- Base64 được sử dụng để mã hóa các chuỗi ký tự trong các tệp LDIF
- Base64 đôi khi được sử dụng để nhúng dữ liệu nhị phân vào tệp XML, sử dụng cú pháp tương tự như ...... ví dụ: bookmark của Firefox.html.
- Base64 cũng được sử dụng khi liên lạc với các thiết bị in Chữ ký tài chính của chính phủ (thông thường, qua các cổng nối tiếp hoặc song song) để giảm thiểu độ trễ khi chuyển các ký tự biên nhận để ký.
- Base64 được sử dụng để mã hóa các tệp nhị phân như hình ảnh trong các tập lệnh, để tránh phụ thuộc vào các tệp bên ngoài.
- Có thể được sử dụng để nhúng dữ liệu hình ảnh thô vào thuộc tính CSS như hình nền.
Một số giao thức vận chuyển chỉ cho phép các ký tự chữ và số được truyền đi. Chỉ cần tưởng tượng một tình huống trong đó các ký tự điều khiển được sử dụng để kích hoạt các hành động đặc biệt và / hoặc chỉ hỗ trợ độ rộng bit giới hạn cho mỗi ký tự. Base64 biến đổi bất kỳ đầu vào thành một mã hóa mà chỉ sử dụng ký tự chữ và số, +
, /
và =
là một nhân vật đệm.
Việc sử dụng Base64 tôi sẽ mô tả ở đây có phần hack. Vì vậy, nếu bạn không thích hack, xin đừng tiếp tục.
Tôi đã gặp rắc rối khi phát hiện ra rằng utf8 của MySQL không hỗ trợ các ký tự unicode 4 byte vì nó sử dụng phiên bản utf8 3 byte. Vì vậy, những gì tôi đã làm để hỗ trợ unicode 4 byte đầy đủ trên utf8 của MySQL? Vâng, base64 mã hóa chuỗi khi lưu trữ vào cơ sở dữ liệu và giải mã base64 khi truy xuất.
Vì mã hóa và giải mã cơ sở là rất nhanh, nên ở trên đã hoạt động hoàn hảo.
Bạn có những điểm sau cần lưu ý:
Mã hóa Base64 sử dụng thêm 33% dung lượng lưu trữ
Các chuỗi được lưu trữ trong cơ sở dữ liệu sẽ không thể đọc được bằng con người (Bạn có thể bán nó như một tính năng mà các chuỗi cơ sở dữ liệu sử dụng một hình thức mã hóa cơ bản).
Bạn có thể sử dụng phương pháp trên cho bất kỳ công cụ lưu trữ nào không hỗ trợ unicode.
utf8
loại của chúng vẫn chỉ là ba byte; Nếu bạn muốn điều thực sự, sử dụng utf8mb4
. Hack đẹp, nhưng không còn cần thiết
Nó được sử dụng để chuyển đổi dữ liệu nhị phân tùy ý sang văn bản ASCII.
Ví dụ, tệp đính kèm e-mail được gửi theo cách này.
Tôi sử dụng nó theo nghĩa thực tế khi chúng ta chuyển các đối tượng nhị phân (hình ảnh) lớn qua các dịch vụ web. Vì vậy, khi tôi đang thử nghiệm dịch vụ web C # bằng cách sử dụng tập lệnh python, đối tượng nhị phân có thể được tạo lại với một chút phép thuật.
[Trong trăn]
import base64
imageAsBytes = base64.b64decode( dataFromWS )
Các lược đồ mã hóa của Basic Base64 thường được sử dụng khi có nhu cầu mã hóa dữ liệu nhị phân cần lưu trữ và chuyển qua phương tiện được thiết kế để xử lý dữ liệu văn bản. Điều này là để đảm bảo rằng dữ liệu vẫn còn nguyên vẹn mà không cần sửa đổi trong quá trình vận chuyển (Wiki, 2017)
Ví dụ có thể là như sau: bạn có một dịch vụ web chỉ chấp nhận ký tự ASCII. Bạn muốn lưu và sau đó chuyển dữ liệu của người dùng sang một số vị trí (API) khác nhưng người nhận muốn nhận dữ liệu chưa được xử lý. Base64 là dành cho điều đó. . . Nhược điểm duy nhất là mã hóa base64 sẽ cần khoảng trống nhiều hơn khoảng 33% so với các chuỗi thông thường.
Một ví dụ :: uenc = url = mã hóa aHR0cDovL2xvYy5tYWdlbnRvLmNvbS9hc2ljcy1tZW4tcy1nZWwta2F5YW5vLXhpaS5odG1s = http://loc.querytip.com/asics-men-s-gel-kayano-xii.html .
Như bạn có thể thấy, chúng tôi không thể đặt char / dữ liệu trong URL nếu chúng tôi muốn gửi URL được truy cập lần cuối dưới dạng tham số vì chúng tôi sẽ phá vỡ quy tắc thuộc tính / giá trị cho tham số MOD MOD viết lại - Tham số GET.
Một ví dụ đầy đủ sẽ là: Nhật http://loc.querytip.com/checkout/cart/add/uenc/http://loc.magento.com/asics-men-s-gel-kayano-xii.html/product / 93 / ”
Hầu hết, tôi đã thấy nó được sử dụng để mã hóa dữ liệu nhị phân trong các ngữ cảnh chỉ có thể xử lý ascii - hoặc một bộ ký tự đơn giản.
Để mở rộng một chút về những gì Brad đang nói: nhiều cơ chế truyền tải cho email và Usenet và các cách di chuyển dữ liệu khác không phải là "8 bit sạch", điều đó có nghĩa là các ký tự bên ngoài bộ ký tự ascii tiêu chuẩn có thể được xử lý trong quá cảnh - ví dụ: 0x0D có thể được xem như là một sự trở lại vận chuyển, và biến thành một sự trở lại vận chuyển và nguồn cấp dữ liệu. Cơ sở 64 ánh xạ tất cả các ký tự nhị phân thành một số chữ cái và số ascii tiêu chuẩn và dấu chấm câu để chúng không bị sai lệch theo cách này.
Cơ sở64
Base64 là một thuật ngữ chung cho một số lược đồ mã hóa tương tự mã hóa dữ liệu nhị phân bằng cách xử lý nó bằng số và dịch nó thành biểu diễn 64 cơ sở. Thuật ngữ Base64 bắt nguồn từ một mã hóa chuyển nội dung MIME cụ thể.
Các lược đồ mã hóa Base64 thường được sử dụng khi có nhu cầu mã hóa dữ liệu nhị phân cần lưu trữ và chuyển qua phương tiện được thiết kế để xử lý dữ liệu văn bản. Điều này là để đảm bảo rằng dữ liệu vẫn còn nguyên vẹn mà không cần sửa đổi trong quá trình vận chuyển. Base64 được sử dụng phổ biến trong một số ứng dụng bao gồm email qua MIME và lưu trữ dữ liệu phức tạp trong XML.
Base64 có thể được sử dụng cho nhiều mục đích.
Lý do chính là để chuyển đổi dữ liệu nhị phân thành một cái gì đó có thể qua được.
Đôi khi tôi sử dụng nó để truyền dữ liệu JSON từ trang này sang trang khác, lưu trữ thông tin trong cookie về người dùng.
Lưu ý: Bạn "có thể" sử dụng nó để mã hóa - Tôi không hiểu tại sao mọi người nói bạn không thể, và đó không phải là mã hóa, mặc dù nó có thể dễ dàng bị phá vỡ và được tán thành. Mã hóa có nghĩa là không có gì khác hơn là chuyển đổi một chuỗi dữ liệu sang một chuỗi dữ liệu khác có thể được giải mã sau đó hoặc không, và đó là những gì cơ sở64 làm.
Một chữ số thập lục phân là một nibble (4 bit). Hai nibble tạo ra 8 bit còn được gọi là 1 byte.
MD5 tạo ra một đầu ra 128 bit, được biểu diễn bằng một chuỗi gồm 32 chữ số thập lục phân, lần lượt là 32 * 4 = 128 bit. 128 bit tạo 16 byte (vì 1 byte là 8 bit).
Mỗi ký tự Base64 mã hóa 6 bit (ngoại trừ ký tự không phải pad cuối cùng có thể mã hóa 2, 4 hoặc 6 bit; và các ký tự pad cuối cùng, nếu có). Do đó, trên mỗi mã hóa Base64, hàm băm 128 bit yêu cầu ít nhất ⌈128 / 6⌉ = 22 ký tự, cộng với pad nếu có.
Sử dụng cơ sở64, chúng tôi có thể tạo đầu ra được mã hóa có độ dài mong muốn (6, 8 hoặc 10). Nếu chúng ta chọn quyết định đầu ra dài 8 char, nó chỉ chiếm 8 byte trong khi nó chiếm 16 byte cho đầu ra băm 128 bit.
Vì vậy, ngoài bảo mật, mã hóa base64 cũng được sử dụng để giảm dung lượng tiêu thụ.