2009-08-12 46 views
5

trong mật khẩu ứng dụng Windows C hiện tại của tôi đã được lưu trữ trong văn bản thuần túy rõ ràng là không tốt. vì vậy tôi chỉ muốn biết cách tốt nhất để mã hóa mật khẩu và được lưu trữ trong SQL Server là gì. Tôi đã đọc rằng sử dụng hàm băm + muối tốt hơn. nhưng tôi cảm thấy "EncryptByPassPhrase", "DecryptByPassPhrase" tính năng mới trong sql 2005 là tốt hơn để sử dụng bởi vì bạn đang xử lý tất cả mọi thứ từ SQL Server chính nó và tôi cho rằng nó sử dụng ba DES. ai đó có thể đề nghị là nó tốt để sử dụng nó?Cách tốt nhất để lưu mật khẩu vào sql

+0

thnks rất nhiều cho trả lời của bạn. tôi nghĩ rằng sử dụng sha1 hoặc sha256 với shud muối là tốt. chỉ drwabck là tht tôi không thể decrpyt nó. nhưng nó vẫn có ý nghĩa. nhưng tôi cũng đã biết abt BCRYPT trông thật tuyệt vời, nhưng đối với proj thì nó đủ để sử dụng SHA. nếu ai muốn biết abt bcrypt thì chk ths link- http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx –

Trả lời

3

Một băm & muối là cách để đi, bởi vì nó không thể lấy lại mật khẩu ban đầu từ nó. Nếu bạn mã hóa sau đó giải mã mật khẩu, mật khẩu thô có thể truy xuất được vì vậy nó không phải là tốt nhất.

+0

Có , thuật toán băm là một lựa chọn tốt. – adatapost

2

Tôi đồng ý với việc mã hóa tất cả ở một nơi. Tuy nhiên, nếu bạn tách khóa khỏi dữ liệu (khóa trong mã C#, dữ liệu trong db), điều đó sẽ làm tăng tính bảo mật. Ngoài ra, Sql Server sử dụng một khóa chủ khi mã hóa, có nghĩa là nếu bạn cần khôi phục dữ liệu đến một máy chủ mới, bạn sẽ gặp khó khăn khi khôi phục dữ liệu.

Tất cả điều này đi vào quản lý khóa và cách bạn muốn thực hiện việc này.

5

Bạn có cần phải có quyền truy cập vào mật khẩu ban đầu hoặc bạn chỉ cần thử và so sánh mật khẩu đã nhập với mật khẩu đã nhập trong cơ sở dữ liệu?

Nếu bạn cần truy cập mật khẩu ban đầu, khi đó bạn sẽ phải sử dụng thuật toán mã hóa thay vì thuật toán băm.

Nếu tất cả những gì bạn đang làm là lưu trữ mật khẩu trong cơ sở dữ liệu để bạn có thể kiểm tra sau này với giá trị đầu vào đã biết, thì một hàm băm có muối sẽ hoạt động.

Hãy nhớ rằng khi khách hàng gửi thông tin xác thực qua để được xác thực, bạn không muốn gửi mật khẩu bằng văn bản rõ ràng!

+0

Về đoạn cuối. Làm thế nào để bạn gửi mật khẩu? Bạn có băm nó phía khách hàng và gửi băm? Nếu vậy, khách hàng sẽ không thể thấy thuật toán được sử dụng? –

+0

@miparnisari Không quan trọng nếu họ biết thuật toán băm được sử dụng như thế nào - điểm của băm một chiều là cho đầu ra, rất khó để tìm đầu vào. Cuộc chiến giúp chống lại [bảng cầu vồng] (https://en.wikipedia.org/wiki/Rainbow_table) bạn nên sử dụng một muối (điểm thưởng: sử dụng một muối khác nhau cho mỗi người dùng) để làm cho nó để nếu một diễn viên xấu kết thúc với một bản sao đầy đủ của băm mật khẩu của bạn, họ sẽ phải tính toán một loạt các bảng cầu vồng để bạo lực ra tất cả các mật khẩu của bạn. – scwagner

0

Giống như hầu hết các câu hỏi, câu trả lời hay nhất phụ thuộc vào ngữ cảnh của tình huống của bạn. Không có giải pháp tốt.

Một số tùy chọn:

  1. Để lại mật khẩu trong văn bản đơn giản hoặc mã hóa reversably. Sử dụng các cơ sở SQLServer để mã hóa các trường quan trọng ở cấp RDBMS hoặc sử dụng các hàm mã hóa tương tự và hy vọng rằng MS đã thực hiện quản lý khóa hợp lý và các khóa được bảo mật hợp lý cho các mục đích của bạn. Trong thực tế tất cả các mã hóa không là lưu trữ sụp đổ của một toàn bộ rất nhiều bí mật nhỏ vào lưu trữ của một bí mật lớn .. Nó có thể làm cho vấn đề dễ quản lý hơn nhưng vấn đề chính nó không bao giờ biến mất.

  2. Không thể đảo ngược "Mã hóa" mật khẩu bằng thuật toán băm hoặc một số dạng crypt(). Tùy thuộc vào các vectơ tấn công có sẵn phương pháp này có thể không cung cấp nhiều trong cách thực hiện bảo mật thực tế trên lưu trữ bản rõ.

. Sử dụng mật khẩu băm giới hạn các tùy chọn của bạn về lựa chọn một thuật toán xác thực an toàn. Với cách tiếp cận này, bạn có thể sẽ gửi các văn bản thuần túy hoặc các tài liệu khác không tốt hơn vận chuyển (bất kể mã hóa không được sử dụng hay không) đây có thể là một rủi ro đáng kể từ POV tin cậy.

. Dễ bị tấn công từ điển ngoại tuyến nếu băm bị đánh cắp khôi phục một số phần mật khẩu nên được giả định hoàn toàn nếu chúng có bất kỳ giá trị nào đối với kẻ tấn công.

. Trong một số trường hợp, kiến ​​thức về mật khẩu băm có thể xấu như biết mật khẩu về mặt truy cập hệ thống.

0

Nếu bạn chắc chắn rằng bạn sẽ không bao giờ sử dụng lược đồ được băm để xác thực (như HTTP Digest Auth), mật khẩu băm được bảo mật hơn. Để tránh tấn công bảng cầu vồng, hãy sử dụng một nonce (hoặc muối). Tôi sẽ sử dụng HMAC-SHA1 và sử dụng nonce làm khóa. Chúng phải được lưu trữ bằng mật khẩu.

Nếu không, bạn sẽ phải lưu trữ mật khẩu được mã hóa vì mật khẩu băm không thể hoạt động với xác thực liên quan đến băm. Để mã hóa, tôi có các đề xuất sau,

  1. Không lưu khóa trong DB, cũng không mã hóa khóa đó. Lưu trữ một số nơi an toàn khác, như sử dụng DPAPI trên Windows.
  2. Đảm bảo bạn có phiên bản khóa để bạn có thể xoay phím để tuân thủ các tiêu chuẩn nhất định.
  3. Tôi không quen với việc mã hóa trong SQLServer. Hãy chắc chắn rằng nó có một Vector ban đầu ngẫu nhiên. Bạn có thể kiểm tra điều này bằng cách mã hóa cùng một mật khẩu hai lần, nó sẽ tạo ra bản mã khác nhau. Nếu không có IV ngẫu nhiên, không sử dụng nó, chỉ cần mã hóa nó trong ứng dụng của bạn.
Các vấn đề liên quan