Công cụ dành cho nhà phát triển · Máy tính hàm băm SHA
Hex, Base64 và Byte thô: Ba cách để viết giống nhau SHA Digest
· Cách thức hoạt động
sha-256 base64 mã hóa file-formats
sha256sum in hex, package-lock.json lưu trữ base64 và Docker sử dụng tiền tố sha256:. Tất cả chúng đều có thể giống 32 bytes. Bài đăng này giải thích từng cách biểu diễn và cách chuyển đổi giữa chúng.
Các giá trị băm trông khác nhau nhưng giống nhau — một chuỗi tệp khóa và tổng kiểm tra đầu cuối cho cùng một tệp
Thông báo SHA-256 về cơ bản là 32 bytes. Cách bạn viết các byte đó sẽ xác định thông báo trông như thế nào. Một thông báo, 32 byte giống hệt nhau, xuất hiện dưới dạng 64 ký tự thập lục phân (hai ký tự trên mỗi byte) hoặc 44 ký tự cơ sở64 (khoảng bốn trên ba byte) hoặc độ dài và định dạng khác nhau tùy thuộc vào mã hóa. Sự nhầm lẫn nảy sinh do một tệp khóa có thể hiển thị một biểu diễn và thiết bị đầu cuối hiển thị một biểu diễn khác, cả hai đều cho cùng một 32 bytes cơ bản.
Hiểu về mã hóa là bước chuyển sang câu hỏi "tại sao những thứ này trông khác nhau?" thành "Tôi có thể xác nhận chúng giống nhau." Tất cả ba cách biểu diễn đều tương đương khi bạn giải mã chúng thành byte.
Thông báo tóm tắt là byte — 20, 32, 48 hoặc 64 trong số chúng tùy thuộc vào thuật toán, trước khi mã hóa văn bản
Trước khi tồn tại bất kỳ biểu diễn văn bản nào, kết quả là một ArrayBuffer gồm các byte tóm tắt. ToolAcre bọc bộ đệm đó bằng Uint8Array, sau đó ghi mỗi byte dưới dạng hai chữ số thập lục phân hoặc chuyển đổi từng byte thành ký tự nhị phân trước khi gọi btoa. Cả hai trình định dạng đều không chạy lại hàm băm và cũng không thay đổi một bit thông báo nào.
Độ rộng byte tuân theo thuật toán đã chọn trong công cụ này: SHA-1 trả về 20 byte, SHA-256 ba mươi hai, SHA-384 bốn mươi tám và SHA-512 sáu mươi bốn. Đó là những kết quả đầu ra được hỗ trợ được xác minh bằng siêu dữ liệu và thử nghiệm thuật toán. Các byte thô phù hợp để so sánh theo chương trình; hex và base64 là các ký hiệu truyền tải cho các kênh yêu cầu văn bản.
Hex - hai ký tự trên mỗi byte, tại sao nó thống trị các công cụ dòng lệnh và câu hỏi tình huống
Biểu diễn thập lục phân sử dụng các chữ số 0-9 và các chữ cái A-F (hoặc a-f) để biểu thị 16 các giá trị có thể có của một nibble 4-bit. Hai chữ số hex đại diện cho một byte. Thông báo tóm tắt SHA-256 của abc đầu vào là 32 bytes, do đó, nó hiển thị dưới dạng 64 ký tự thập lục phân: ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad. Đây là định dạng mà hầu hết các công cụ dòng lệnh in. Hệ thập lục phân dễ đọc và rõ ràng; mỗi byte được biểu thị bằng chính xác hai ký tự giống nhau mỗi lần.
Hệ thập lục phân là định dạng mặc định cho tổng kiểm tra và giá trị băm trong tài liệu và trên dòng lệnh. Nó dễ đọc và sao chép, không có phần đệm, không có phân biệt chữ hoa chữ thường trong cách giải thích (mặc dù quy ước quy định nhất quán chữ thường hoặc chữ hoa) và không có ký tự đặc biệt nào cần thoát trong URL hoặc JSON. Nhược điểm là nó cần gấp đôi số ký tự so với byte thô, đó là lý do tại sao các định dạng khác tồn tại.
Base64 và base64url - khoảng bốn ký tự trên ba byte, phần đệm và vị trí mỗi ký tự xuất hiện (SRI, npm, SSH dấu vân tay)
Base64 mã hóa ba byte thành bốn ký tự được rút ra từ bảng chữ cái gồm 64 ký tự: A-Z, a-z, 0-9, +, /. Ba byte 61 62 63 (mã ASCII cho abc) mã hóa thành YWJj trong cơ sở64. Thông báo 32 byte đầy đủ SHA-256 mã hóa khoảng 44 ký tự cơ sở64. Khoảng đệm bằng = ký tự sẽ đưa độ dài đầu ra lên bội số của 4, vì vậy 44 ký tự cộng với 0 khoảng đệm (vì 32 là bội số của 3 nên không cần khoảng đệm). Giải mã đảo ngược quá trình: bốn ký tự base64 giải mã thành ba byte.
Base64 xuất hiện trong các tệp package-lock.json, thuộc tính npm thu nhỏ, SRI (Tính toàn vẹn của nguồn phụ) trong HTML và SSH dấu vân tay chính. Nó nhỏ gọn — dài hơn khoảng 33% so với byte thô, so với 100% của hệ thập lục phân dài hơn. Sự đánh đổi là không phải tất cả các cách trình bày văn bản đều dễ đọc như nhau; base64 trông có vẻ lộn xộn hơn so với mắt người so với hex.
Biểu mẫu tiền tố — sha256: trong thông báo vùng chứa, sha384- trong thuộc tính toàn vẹn, SHA256: trong SSH
Base64url là một biến thể được xác định trong RFC 4648 thay thế - và _ cho + và /. Bảng chữ cái trở thành A-Z, a-z, 0-9, -, _. JWT sử dụng base64url vì + và / có ý nghĩa đặc biệt trong URL (+ có thể được đọc dưới dạng khoảng trắng trong chuỗi truy vấn, / là dấu phân cách đường dẫn). Phân đoạn JWT luôn được mã hóa base64url và bộ giải mã yêu cầu base64 tiêu chuẩn sẽ từ chối phân đoạn đó. Ngược lại, bộ giải mã base64url không chấp nhận bảng chữ cái tiêu chuẩn sẽ không hoạt động trên base64 tiêu chuẩn.
Phần đệm là tùy chọn trong base64url. Các miếng đệm base64 tiêu chuẩn có = để đảm bảo độ dài đầu ra là bội số của 4. Base64url thường bỏ qua phần đệm vì bản thân = URL-khó xử. Bộ giải mã phải chấp nhận base64url có hoặc không có phần đệm và bộ mã hóa phải nêu rõ ràng về kết quả mà nó tạo ra. Công cụ ToolAcre base64 chấp nhận cả bảng chữ cái và chấp nhận phần đệm bị thiếu ở đầu vào, đồng thời cho phép bạn chọn định dạng ở đầu ra.
Ví dụ đã hoạt động - một bản tóm tắt được chuyển đổi từ hex sang base64 và ngược lại, với các ranh giới byte được đánh dấu
Các biểu mẫu tiền tố thêm mã định danh lược đồ vào bản tóm tắt. Thông báo hình ảnh Docker sử dụng sha256:ba7816bf..., trong đó sha256: là tiền tố. SSH dấu vân tay sử dụng SHA256:, với dấu hai chấm. Một số công cụ sử dụng sha256= hoặc SHA256= (có dấu bằng). Tiền tố hoàn toàn mang tính thông tin; nó cho bạn biết thuật toán nào tạo ra thông báo. Việc loại bỏ tiền tố sẽ để lại các byte giống nhau trong cùng một mã hóa.
Khi so sánh các thông báo, tiền tố là tiếng ồn. Nếu một công cụ in SHA256:ba78... và một công cụ khác in ba78..., thì chúng giống nhau; tiền tố chỉ là siêu dữ liệu về định dạng. Tương tự, các tiền tố như sha256:- (được sử dụng trong một số ngữ cảnh vùng chứa) hoặc sha384- (được sử dụng trong các thuộc tính toàn vẹn) là các quy ước định dạng không thay đổi byte. Tách chúng ra để so sánh.
Điều này không bao gồm những gì - mã hóa mà một công cụ nhất định phát ra; kiểm tra định dạng đầu ra trước khi so sánh
Một thông báo, SHA-256 của abc đầu vào, xuất hiện dưới nhiều dạng: hex (64 ký tự), base64 có phần đệm (44 ký tự), base64url có phần đệm (44 ký tự, với - và _ thay vì + và /), hoặc với nhiều tiền tố khác nhau. Để xác nhận chúng giống nhau, hãy giải mã từng byte trở lại byte và so sánh các byte. biểu diễn hex ba7816bf... giải mã thành các byte 0xba 0x78 0x16 0xbf 0x8f 0x01 0xcf 0xea ... Biểu diễn base64 chuyển đổi thành cùng một chuỗi byte khi được giải mã.
Theo mặc định, máy tính băm ToolAcre SHA xuất ra ở dạng thập lục phân. Nếu cần base64, bạn có thể sử dụng công cụ riêng để chuyển đổi hex sang base64 hoặc sử dụng tiện ích base64 trên cùng một trang để mã hóa văn bản trực tiếp. Các công cụ được thiết kế cho các ngữ cảnh cụ thể (npm cho package-lock.json, Docker để tóm tắt hình ảnh) xuất ra theo định dạng mà ngữ cảnh của chúng mong đợi. Hiểu rằng tất cả những thứ này đều giống nhau 32 bytes trong những bộ quần áo khác nhau sẽ loại bỏ sự nhầm lẫn khi các công cụ không đồng nhất về định dạng.
Bài học rút ra: so sánh byte chứ không phải chuỗi — tính toán kết quả tóm tắt bằng máy tính băm ToolAcre SHA, sau đó chuyển đổi sang biểu diễn mà bạn đang kiểm tra
Để chuyển đổi thông số thập lục phân thành base64 theo cách thủ công, hãy nhóm các chữ số hex thành byte, chuyển đổi từng byte thành số thập phân, sau đó mã hóa bằng bảng chữ cái base64. Byte 0xba (hex ba) là số thập phân 186; 0x78 là 120; 0x16 là 22; 0xbf là 191. Việc nhóm bốn byte này và mã hóa thành base64 sẽ tạo ra các ký tự w (0 + 22 trong bảng chữ cái), dưới dạng (mã hóa 186), AA (mã hóa 120), vw (mã hóa 191). Thông báo đầy đủ yêu cầu thực hiện việc này 10 lần và đệm nếu cần. Quá trình thủ công này mang tính hướng dẫn nhưng tẻ nhạt; một công cụ chuyển đổi base64 giúp thực hiện điều đó ngay lập tức.
Thông tin chi tiết quan trọng là thông báo trước tiên là byte và cách trình bày văn bản là thứ yếu. Mọi mã hóa của cùng một byte sẽ giải mã trở lại cùng một byte và do đó có thể hoán đổi cho nhau nhằm mục đích xác minh tính toàn vẹn. Sự khác biệt về kiểu chữ trong hex, sự khác biệt về phần đệm trong base64, tiền tố và khoảng cách đều là những lựa chọn định dạng không ảnh hưởng đến giá trị thực. Khi bạn thành thạo khả năng chuyển đổi giữa các cách biểu diễn, các lỗi định dạng tóm tắt không khớp sẽ trở thành các vấn đề gỡ lỗi mà bạn có thể giải quyết thay vì bí ẩn.