2011-11-14 10 views
5

Tôi có một dự án và dường như các nhà thiết kế phần mềm đã không đưa vấn đề bảo mật vào xem xét.Mã hóa AES của T-SQL so với Hashing/Salting để đăng nhập người dùng vào trang web

Mật khẩu được lưu trữ ở dạng văn bản thuần túy và được truyền qua văn bản thuần túy. Vì vậy, tôi còn lại với nhiệm vụ sửa lỗi này.

Tôi hơi bị đe dọa về an ninh, vì vậy câu hỏi của tôi là: để xác thực mật khẩu người dùng trực tuyến tốt hơn là sử dụng kỹ thuật băm/muối hay sử dụng mã hóa AES tốt hơn? Tôi có thể có những ưu và khuyết điểm.

Sẽ tốt hơn nếu bạn sử dụng nhà cung cấp thành viên ASP.NET? Điều này có dễ dàng không? Tôi đã sử dụng nó trước đây, nhưng phần mềm gọi trên các bảng riêng của nó, vì vậy tôi không chắc liệu đó có phải là rắc rối hơn ở đó không.

Nếu điều này đã được trả lời thì ai đó có thể hướng dẫn tôi ở đó, bởi vì tôi không tìm thấy so sánh.

Trả lời

8

Bạn KHÔNG BAO GIỜ lưu trữ mật khẩu bằng cách sử dụng mã hóa đối xứng.

Muối ngẫu nhiên cho mỗi người dùng, băm mật khẩu của họ, lưu trữ cả muối và băm trong cơ sở dữ liệu. Sau đó, trên các yêu cầu đăng nhập bạn nhận được người dùng qua email/tên người dùng/id, v.v, sau đó sử dụng muối gắn với người dùng đó và băm mật khẩu được cung cấp của họ và sau đó so khớp nó với băm được lưu trữ. Nếu phù hợp, đăng nhập, mật khẩu khác xấu.

Nếu bạn sử dụng nhà cung cấp thành viên ASP.NET được xây dựng, nó sẽ làm điều này cho bạn.

+0

Câu trả lời tôi cần cảm ơn. Trên lưu ý của thành viên asp.net: Các phần mềm đã không sử dụng nó (mà giải thích đau đầu). Tôi đã chỉ xem xét các bảng và tôi nghĩ rằng giải pháp tốt nhất là chỉ cần thêm một cột mới cho userid aspmembership. – pqsk

+0

Lưu ý rằng việc thêm một cột mới cho userm aspmembership không tránh được nastiness tôi đề cập đến trong [answer] (http://stackoverflow.com/questions/8123382/t-sql-aes-encryption-vs-hashing-salting-for -logging-in-users-to-website/8123808 # 8123808), mặc dù nó cung cấp cho bạn các lựa chọn về chính xác loại tên người dùng thay đổi xấu nào sẽ giới thiệu. – Brian

1

Tôi đề nghị bạn nên băm nhiều mật khẩu muối. Hơn 10 lần hoặc một cái gì đó. Vậy tại sao? Bởi vì cho bạn băm một mật khẩu muối sẽ không nhận ra lâu hơn. Nhưng đối với một anh chàng ác cố gắng kết hợp khác nhau để brutefocre một mật khẩu, phải mất 10 lần nhiều thời gian mỗi lần thử. Và anh ta không thể chắc chắn nếu bạn đã làm nó 10 hoặc 1000 lần.

Tôi sử dụng cá nhân này làm tăng bảo mật giá rẻ.

Xem ở đây: Stackoverflow Salting Your Password: Best Practices?

hoặc có Secure hash and salt for PHP passwords

Chúc may mắn :)

Harry

-2

Nó phụ thuộc vào việc hay không muốn để có thể khôi phục mật khẩu người dùng cho một số hoạt động. Nếu bạn đi với hashing/salting, điều đó có nghĩa là mỗi khi người dùng quên mật khẩu của họ, bạn sẽ phải có ứng dụng tạo ra một mật khẩu mới, an toàn. Nếu bạn đi với mã hóa đối xứng, sau đó bạn ít nhất cung cấp cho người dùng một cơ hội để khôi phục lại mật khẩu hiện tại của họ và thay đổi nó sau này lúc thuận tiện của họ.

Tôi không thể trả lời liệu có tăng cường bảo mật theo cách nào hay không. Một người có kiến ​​thức nhiều hơn tôi sẽ phải trả lời có hay không ít khả thi hơn để crack một thuật toán băm/băm như trái ngược với một thuật toán mã hóa đối xứng. Trên bề mặt, băm/muối có vẻ an toàn hơn vì kẻ tấn công phải tìm ra thuật toán trước khi anh ta có thể bắt đầu bẻ mật khẩu. Nhưng cũng có thể nói nếu bạn quyết định sử dụng một thuật toán mã hóa đối xứng khác. Bạn cũng có thể kết hợp các thuật toán khóa đối xứng trong trường hợp bạn cho rằng AES không đủ an toàn.

+1

Hashing/salting an toàn hơn vì bạn không lưu trữ mật khẩu. Người nào đó đột nhập vào máy chủ của bạn sẽ không thể chạy chức năng ma thuật để lấy tất cả mật khẩu người dùng (và sau đó sử dụng chúng trên các máy chủ khác) ... mặc dù họ có thể crack mật khẩu "phổ biến" (chắc chắn, có là nhiều mật khẩu chia sẻ một băm với "Password1", nhưng rất có thể là người dùng đang sử dụng "Password1"). – Brian

+2

-1 để chủ trương truy cập vào mật khẩu. Đây là một vi phạm bảo mật cực đoan, nếu bạn cho tôi một vài trăm email và mật khẩu từ một hệ thống đăng nhập thế giới thực (có thể một vài nghìn) tôi sẽ tìm thấy ít nhất 1 tài khoản paypal hoạt động với thông tin đó. Hashing có nghĩa là bảo vệ mật khẩu bị xâm nhập cả từ một người dùng độc hại xâm nhập vào hệ thống của bạn VÀ từ một quản trị viên hệ thống độc hại đã có quyền truy cập. –

+0

@Brian Bạn tạo một trường hợp tốt để sử dụng băm trong vấn đề đó. Tuy nhiên, nó có nghĩa là mật khẩu hiện tại không bao giờ có thể được phục hồi. Tôi biết trong một số hệ thống họ tiếp tục mã hóa thông tin dựa trên muối được sử dụng trong mật khẩu người dùng, làm cho nó tiếp tục không thể truy cập thông tin về người dùng nếu người dùng quên mật khẩu của họ. Nhưng đó không phải là ở đây cũng không có. Tôi đoán nó thực sự chỉ phụ thuộc vào ứng dụng. – villecoder

1

Việc sử dụng tư cách thành viên không nên gây khó khăn nhiều cho việc tự mình thực hiện toàn bộ nội dung và có thể an toàn hơn.Chỉ cần sử dụng tên người dùng hiện tại của người dùng làm tên người dùng, buộc người dùng phải đặt lại mật khẩu của họ (sửa hệ thống bảo mật sẽ yêu cầu bạn xóa mật khẩu cũ bất kể) và thay đổi tất cả các móc của bạn để kiểm tra người dùng sử dụng Membership.GetUser() hoặc tương tự.

Sẽ có một chút bất tiện nếu bạn hỗ trợ khả năng thay đổi tên người dùng. Thay đổi tên người dùng có thể giới thiệu một lỗ hổng bảo mật nếu không được thực hiện cẩn thận vì tư cách thành viên dựa vào tên người dùng và người dùng theo cách có thể gây ra lỗ hổng (mặc dù điều này yêu cầu người dùng không độc hại thay đổi tên riêng của họ, vì vậy nó không phải là một lỗ hổng lớn).

+0

Bạn có thể giải thích các mối quan ngại về bảo mật với nhà cung cấp thành viên nếu người dùng có thể thay đổi tên người dùng của họ không? –

+0

@ChrisMarisic: Nhà cung cấp tư cách thành viên không cung cấp supoort được tích hợp sẵn để thay đổi tên người dùng. Ai đó bằng cách nào đó biết rằng bạn đang thay đổi tên người dùng của mình, sau đó có thể thay đổi tên người dùng của họ thành tên người dùng cũ của bạn.Sau đó, khi họ cố gắng truy cập thông tin, hệ thống có thể trả lại thông tin của bạn một cách không chính xác. Về cơ bản, khi bạn kết hợp hai phần thông tin nhận dạng với nhau, bạn phải đảm bảo rằng chúng hoàn toàn đồng bộ, không chỉ trong cơ sở dữ liệu mà còn trong bất kỳ bộ nhớ cache nào (và có thể phải đặt lại dữ liệu phiên). AspNet sẽ không làm điều này cho bạn. – Brian

+0

@ChrisMarisic: Hơn nữa, có 3 dữ liệu có thể đồng bộ hóa, vì OP phải sử dụng quyền kiểm soát đăng nhập của riêng mình hoặc phải giữ tên người dùng trong hệ thống tài khoản hiện tại của mình được đồng bộ hóa với tên người dùng của họ trong tư cách thành viên. – Brian