2012-02-12 58 views
5

Tôi đang cố gắng tạo một trang web có tính năng đăng nhập/đăng xuất và tôi có kế hoạch băm và nhập mật khẩu đúng cách. Vấn đề tôi phải đối mặt, tuy nhiên, là làm thế nào tôi muốn đi về lưu trữ mật khẩu trong cơ sở dữ liệu. Tôi biết rằng tôi cần phải lưu trữ mật khẩu băm + muối trong cơ sở dữ liệu (không phải trong văn bản thuần hoặc mã hóa đơn giản), nhưng tôi không biết làm thế nào để kỹ thuật có được xung quanh chèn dữ liệu nhị phân vào cơ sở dữ liệu.Làm cách nào để lưu trữ băm trong cơ sở dữ liệu SQL Server bằng C#?

Trong nỗ lực ban đầu, cách duy nhất tôi có thể lấy dữ liệu trong cơ sở dữ liệu là chuyển dữ liệu nhị phân thành chuỗi base64 và chèn vào trường mật khẩu varchar. để làm điều đó.

Trường mật khẩu trong cơ sở dữ liệu hiện là varchar nhưng khi tôi hiểu nó, mật khẩu được băm là nhị phân. Vì vậy, ngay cả khi tôi đã thay đổi trường mật khẩu thành một đối tượng nhị phân, tôi vẫn không biết cách thực sự chèn nó vào!

Nếu tôi không có ý nghĩa gì, vui lòng yêu cầu làm rõ và tôi sẽ liên hệ lại với bạn.

+1

Băm có thể là một varchar ... nó không phải là nhị phân ở tất cả, nhưng ra khỏi sự tò mò chức năng có bạn đang sử dụng là gì? – hackartist

+1

Tại sao bạn không muốn sử dụng base64? Nó đơn giản và dữ liệu đủ nhỏ không phải lo lắng về kích thước. –

+0

Base64 là cách an toàn nhất để loại băm ở dạng có thể đọc được. Không có gì sai với việc lưu trữ một băm muối dưới dạng văn bản thuần túy; đó là toàn bộ mục đích đằng sau việc lưu trữ một băm chứ không phải mật khẩu. – Douglas

Trả lời

3

Không, mật khẩu băm không phải được lưu trữ trong trường biến thể, bạn có thể mã hóa và lưu trữ nó trong trường varchar. Base64 là một lựa chọn tốt để mã hóa bất kỳ loại ký tự nào.

+2

Loại băm nào bạn sử dụng để tạo chuỗi và không phải chuỗi các vết cắn? Tất cả các hàm mật mã có các hàm tôi biết sẽ tạo ra một số bit như 128, 160, 256 hoặc 512 bit và đó không phải là một chuỗi (các chuỗi được lưu trữ bằng cách sử dụng một mã hóa). –

+0

@MartinLiversage Tôi đã sử dụng băm MD5 để lưu trữ mật khẩu trong trường varchar w/o vấn đề. Linux đã sử dụng băm MD5 trong/etc/passwords cho thời gian looooong. Vấn đề là bạn KHÔNG ĐƯỢC lưu trữ chúng trong một trường varbinary. – Icarus

+1

Tất nhiên bạn có thể lưu trữ băm trong các cột 'varchar' nhưng sau đó bạn cần mã hóa chúng bằng cách sử dụng mã hóa base64. Câu trả lời của bạn dường như chỉ ra rằng băm có thể được lưu trữ trực tiếp mà không tính đến các chuỗi nhị phân ngẫu nhiên không có ý nghĩa trong một chuỗi. –

6

Trong Microsoft SQL Server, bạn có thể lưu trữ dữ liệu nhị phân trong các cột có kiểu dữ liệu binary (hoặc varbinary nếu bạn cần dữ liệu độ dài biến đổi). Bạn có thể sử dụng nó cho mật khẩu băm và muối. Nếu bạn sử dụng hàm băm bit 512 và cũng muốn sử dụng một muối 512 bit, bạn cần 2 * 512/8 = 128 byte (ví dụ: binary(128) để lưu trữ muối và băm.

Thông thường bất kỳ API nào bạn sử dụng để đọc và ghi cơ sở dữ liệu nên hỗ trợ bạn trong việc đọc và ghi dữ liệu nhị phân Tuy nhiên, có lẽ bạn muốn sử dụng một số lệnh SQL để trực tiếp chèn một giá trị nhị phân vào một bảng bạn có thể sử dụng cú pháp như thế này:..

insert into MyTable values (0x123456789ABCDEF) 

Không thực sự là một câu trả lời cho bạn câu hỏi, nhưng nếu bạn đấu tranh với việc thực hiện tính năng mật khẩu của riêng bạn, bạn có thể xem xét sử dụng một thành phần sức mạnh công nghiệp được dựng sẵn để tránh các lỗi sai lầm trong tương lai ASP.NET has a membership provider ví dụ:

Các vấn đề liên quan