2012-07-12 39 views
7

Chúng tôi lưu trữ một băm mật khẩu trong cơ sở dữ liệu. Về cơ bản chúng tôi nhận được MD5 băm (mảng byte) và sau đó chạy Encoding.Unicode.GetChars trên mảng byte và lưu trữ kết quả chuỗi trong cơ sở dữ liệu. Sau đó, khi ai đó đăng nhập, chúng tôi băm mật khẩu của họ theo cách tương tự và so sánh hai chuỗi.T-SQL Nhận các byte ra khỏi VARCHAR mà không cần chuyển đổi sang UNICODE

Điều này rất hữu ích, ngoại trừ việc tôi không thể trích xuất băm mật khẩu trong T-SQL và chèn nó vào một hàng khác. Cách duy nhất tôi có thể làm việc đó là nếu tôi thực sự thiết lập băm mật khẩu trực tiếp từ một lựa chọn của một hàng khác với một băm hợp lệ.

Tôi đã cố chuyển đổi chuỗi thành hex và để SQL chuyển đổi chuỗi, nhưng điều đó cũng không hoạt động. Tôi cho rằng đó là vì các byte chúng ta mã hóa là UNICODE có lẽ không tạo thành chuỗi UNICODE hợp lệ.

Vì vậy, ví dụ (SQL Server: Convert a string into a hex string and back):

Khi bạn chạy lệnh sau, từ 'Trợ giúp' được chuyển đổi sang var nhị phân và sau đó trở thành một chuỗi và hey mau! Bạn kết thúc với 'Trợ giúp' một lần nữa.

SELECT CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX), 'Help')) 

Vấn đề là khi tôi chạy trên cột băm mật khẩu, giá trị kết quả không giống như được lưu trữ trong cột. Nếu tôi dán chuỗi chứa băm vào trong SQL Management studio giữa hai ký hiệu, nó sẽ nhảy qua 'và đặt vào một số ký tự khác. Một lần nữa, probalby cố gắng để interperet một chuỗi UNICODE không đầy đủ nhìn thấy vì nó không phải là một chuỗi UNICODE thích hợp.

Vì vậy, những gì tôi đang tìm kiếm là một cách đơn giản là lấy các byte trong VARCHAR (64) có chứa các hash mật khẩu và ghi nó vào một định dạng mã hóa văn bản, một cái gì đó như:

0x0F037584C99E7FD4F4F8C59550F8F507 

Vì vậy mà Sau đó tôi có thể làm điều gì đó như

UPDATE [User] 
SET  PasswordHash = CONVERT(NVARCHAR(64), 0x0F037584C99E7FD4F4F8C59550F8F507) 
WHERE UserID = 123 

Bất kỳ ý tưởng nào?

Trả lời

4

DUH! Tìm thấy rồi. Khi tôi đang đọc lại bài viết của mình, tôi nhận ra rằng trong các ví dụ của tôi, tôi đã sử dụng một chuyển đổi cho VARCHAR, chứ không phải là NVARCHAR. Khi tôi thay đổi nó thành NVARCHAR, tất cả bắt đầu hoạt động.

0

bạn có thể sử dụng

select CONVERT(VARCHAR(MAX), CONVERT(VARBINARY(MAX),FileBytes)) 

    FileBytes=0x3C3F786D6C207665 
Các vấn đề liên quan