Chuyển đổi một mảng byte băm md5 thành một chuỗi


76

Làm cách nào để chuyển đổi kết quả băm, là một mảng byte, thành một chuỗi?

byte[] bytePassword = Encoding.UTF8.GetBytes(password);

using (MD5 md5 = MD5.Create())
{
    byte[] byteHashedPassword = md5.ComputeHash(bytePassword);
} 

Tôi cần chuyển đổi byteHashedPasswordthành một chuỗi.

Câu trả lời:


81
   public static string ToHex(this byte[] bytes, bool upperCase)
    {
        StringBuilder result = new StringBuilder(bytes.Length*2);

        for (int i = 0; i < bytes.Length; i++)
            result.Append(bytes[i].ToString(upperCase ? "X2" : "x2"));

        return result.ToString();
    }

Sau đó, bạn có thể gọi nó như một phương thức mở rộng:

string hexString = byteArray.ToHex(false);

ý nghĩa của cách viết hoa trên là gì?
Blankman

3
một vấn đề ưu tiên. Đó là lý do tại sao tôi đã thêm một tham số để phương pháp của tôi, vì vậy người gọi có thể chọn
Philippe Leybaert

9
Không cần phải phát minh lại bánh xe khi bạn đã cóConvert.ToBase64String()
Eric Petroelje

5
Chuỗi Base64 ngắn hơn. Nó sử dụng tất cả các chữ cái trong bảng chữ cái, chữ số và một vài ký tự dấu câu, vì vậy nó không phải là hệ thập lục phân. Base64 sử dụng 4 ký tự cho 3 byte, trong khi một chuỗi hex sử dụng 6 ký tự cho 3 byte.
Philippe Leybaert

4
@ Eric: có những tình huống mà Base64 không phải là một lựa chọn tốt vì các ký tự dấu bổ sung mà được sử dụng (đi qua nó trong một URL ví dụ)
Philippe Leybaert

65

Tôi luôn thấy điều này là thuận tiện nhất:

string hashPassword = BitConverter.ToString(byteHashedPassword).Replace("-","");

Vì một số lý do kỳ lạ, BitConverter thích đặt dấu gạch ngang giữa các byte, vì vậy việc thay thế chỉ xóa chúng.

Cập nhật: Nếu bạn thích hex "chữ thường", chỉ cần thực hiện .ToLower () và bùng nổ.

Xin lưu ý rằng nếu bạn đang làm điều này như một vòng lặp chặt chẽ và nhiều hoạt động, điều này có thể tốn kém vì có ít nhất hai lần nhập chuỗi ngầm định và thay đổi kích thước đang diễn ra.


tương tự như giải pháp @PhilippeLeybaert, nhưng ở một dòng.
sonjz

28

Bạn có thể sử dụng Convert.ToBase64StringConvert.FromBase64Stringdễ dàng chuyển đổi mảng byte thành chuỗi.


18

Nếu bạn đang ở trại 'sở thích Hex', bạn có thể làm điều này. Về cơ bản, đây là một phiên bản tối thiểu của câu trả lời của Philippe Leybaert.

string.Concat(hash.Select(x => x.ToString("X2")))

B1DB2CC0BAEE67EA47CFAEDBF2D747DF


9

Vì nó là một băm, nó có thể có các giá trị không thể được hiển thị trong một chuỗi bình thường, vì vậy cách tốt nhất là chuyển đổi nó thành chuỗi được mã hóa Base64.

string s = Convert.ToBase64String(bytes);

Và sử dụng

byte[] bytes = Convert.FromBase64(s);

để lấy lại các byte.


4

Chà, bạn có thể sử dụng hàm tạo chuỗi lấy byte và mã hóa, nhưng bạn có thể sẽ gặp khó khăn trong việc quản lý chuỗi từ đó vì nó có thể chứa nhiều ký tự thú vị (byte rỗng, dòng mới, ký tự điều khiển, v.v.)

Cách tốt nhất để làm điều này là mã hóa nó với cơ số 64 để có được một chuỗi đẹp dễ làm việc với:

string s = Convert.ToBase64String(bytes);

Và để đi từ chuỗi đó trở lại một mảng byte:

byte[] bytes = Convert.FromBase64String(s);

0

Đối với bất kỳ ai quan tâm, gói Nuget mà tôi đã tạo có tên CryptoStringify cho phép bạn chuyển đổi một chuỗi thành chuỗi băm bằng cách sử dụng một cú pháp rõ ràng đẹp mắt mà không cần phải thử với các mảng byte:

using (MD5 md5 = MD5.Create())
{
    string strHashedPassword = md5.Hash(password);
}

Nó là một phương thức mở rộng HashAlgorithmKeyedHashAlgorithmcũng hoạt động trên SHA1, HMACSHA1, SHA256, v.v.

https://www.nuget.org/packages/cryptostringify

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.