Tại sao nhiều chuỗi băm và mã hóa kết thúc bằng dấu bằng?


64

Tôi làm việc trong C # và MSSQL và như bạn mong đợi, tôi lưu trữ mật khẩu của mình được muối và băm.

Khi tôi nhìn vào hàm băm được lưu trữ trong một cột nvarchar (ví dụ: nhà cung cấp thành viên aspnet ngoài hộp). Tôi luôn tò mò tại sao các giá trị Salt và Hash được tạo dường như luôn kết thúc bằng một hoặc hai dấu bằng.

Tôi đã thấy những điều tương tự trong khi làm việc với các thuật toán mã hóa, đây là sự trùng hợp ngẫu nhiên hay có lý do cho nó?


19
Bên cạnh đó, nếu bạn đang lưu trữ dữ liệu nhị phân được mã hóa Base64 trong trường NVARCHAR, tôi sẽ khóc vì lãng phí lưu trữ 6x của bạn! Đối với một, Base64 chỉ có thể chứa 64 ký tự ở nửa dưới của ASCII (vì vậy bạn chỉ cần VARCHAR để lưu một nửa). Đối với hai, Base64 phát nổ mỗi byte dữ liệu thành 1-4 ký tự. SQL Server đã có một loại VARBINARY hoàn toàn có khả năng lưu trữ các giá trị băm của bạn mà không bị phình ra từ mã hóa và không quan tâm đến việc đối chiếu trong các so sánh của nó ... :-)
jimbobmcgee

3
@WillieWheeler, băm phải được lưu trữ bằng cách nào đó. Base64 có thể không phải là phương tiện lưu trữ hoàn hảo, nhưng vốn dĩ không có gì sai với nó. Nếu hash("my password")tạo ra mảng [1,2,3,4,5]và tôi cần lưu trữ các giá trị đó trong cơ sở dữ liệu, có những lựa chọn tồi tệ hơn là lưu trữ chuỗi AQIDBAU=(Tất nhiên, nếu hàm băm đang sử dụng đã tạo ra một chuỗi, thì có vẻ hơi ngớ ngẩn khi Base64 mã hóa nó. )
Brian S

2
@WillieWheeler Tôi nghĩ bạn đang thiếu điểm. Đọc lại những gì Brian S đã viết - anh ta đã không nói về các thuộc tính của base64 để băm - đó sẽ là vô lý base64 không phải là một thuật toán băm. Ông nói rằng không có gì sai khi lưu trữ hàm băm (được tạo bởi hàm / thuật toán băm) ở dạng cơ sở64.
Andrew Savinykh

3
OP nói rằng anh ta lưu trữ hàm băm và kết thúc bằng dấu bằng. Điều đó cho thấy rằng anh ta nhầm lẫn băm với mã hóa Base64. Nếu vấn đề là nó tốt để cơ sở mã hóa băm, thì dĩ nhiên, nhưng điều đó có liên quan gì?
Willie Wheeler

2
Vâng, cuối cùng tôi đã nhận ra những gì đang xảy ra. Tôi đã xem các tệp khóa công khai và riêng tư SSH của mình và nhận thấy rằng chúng cũng có các kết thúc = / ==. Đây là các bảng mã cơ sở64 của mảng byte, như mô tả BrianS và zespri. Cảm ơn các bạn.
Willie Wheeler

Câu trả lời:


95

Các chuỗi được băm này (thường là?) Được mã hóa theo định dạng Base64 và dấu bằng được sử dụng để đệm chuỗi để làm cho độ dài (số byte) chia hết cho ba. Wikipedia giải thích nó khá tốt: http://en.wikipedia.org/wiki/Base64 .


36

Nó có thể là đệm mã hóa cơ sở 64 không?

Chuỗi '==' chỉ ra rằng nhóm cuối cùng chỉ chứa một byte và '=' chỉ ra rằng nó chứa hai byte. Ví dụ dưới đây minh họa cách cắt ngắn đầu vào của toàn bộ trích dẫn ở trên thay đổi phần đệm đầu ra:

http://en.wikipedia.org/wiki/Base64#Output_padding

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.