2010-06-14 50 views
10

Ứng dụng của tôi sử dụng lớp RijndaelManaged để mã hóa dữ liệu. Là một phần của mã hóa này, tôi sử dụng một đối tượng SecureString được nạp với một mật khẩu nhận được chuyển đổi thành một mảng byte và được nạp vào khóa của đối tượng RajindaelManaged khi chạy.Lưu trữ mật khẩu an toàn trong mã chương trình?

Câu hỏi tôi có là lưu trữ SecureString này. Người dùng nhập mật khẩu có thể được nhập vào thời gian chạy, và có thể được "an toàn" được nạp vào một đối tượng SecureString, nhưng nếu không có mật khẩu người dùng được nhập, thì tôi cần phải mặc định một cái gì đó.

Vì vậy, cuối cùng là quesiton đi xuống đến:

Nếu tôi cần phải có một số được biết đến chuỗi hoặc byte mảng để nạp vào một đối tượng SecureString mỗi lần ứng dụng chạy của tôi, làm thế nào để làm điều đó? Dữ liệu "mã hóa" cuối cùng được giải mã bởi ứng dụng khác, vì vậy ngay cả khi không có mật khẩu người dùng được chỉ định, tôi vẫn cần dữ liệu được mã hóa trong khi nó chuyển từ ứng dụng này sang ứng dụng khác. Điều này có nghĩa là tôi không thể có mật khẩu mặc định là ngẫu nhiên, bởi vì các ứng dụng khác sẽ không thể giải mã nó một cách chính xác. Một giải pháp có thể tôi đang nghĩ là tạo một dll chỉ tạo ra một cụm mật khẩu, sau đó tôi sử dụng cụm mật khẩu đó và chạy nó thông qua một vài hàm băm/tổ chức lại khác nhau trong thời gian chạy trước khi tôi đưa nó vào đối tượng secureString. Điều này có đủ an toàn không?

Chỉnh sửa Để rõ ràng *: Dữ liệu được mã hóa đang được chuyển qua các tệp giữa các máy. Hãy coi đó là tệp Zip luôn có mật khẩu, một tệp mặc định được giả định nếu không có gì được người dùng nhập trực tiếp.

Trả lời

8

Không có điểm nào trong mã hóa đối xứng với chuỗi được mã hóa cứng vào tệp thi hành của bạn. Nó sẽ chỉ mang lại cảm giác an toàn giả. Không có số lượng băm sửa lỗi chương trình này.

Xem this Pidgin FAQ cho cùng một điểm trong ngữ cảnh khác.

Tôi không rõ lý do tại sao bạn cho rằng bạn cần liên lạc giữa các ứng dụng được mã hóa. Nếu giao tiếp này là cục bộ với máy, thì tôi không thấy cần mã hóa, đặc biệt là mã hóa không phải là người dùng cụ thể. Đây có phải là một chương trình DRM không?

CHỈNH SỬA: Nếu nó được chuyển đến một máy khác, có lẽ bạn có thể mã cứng một public key và sau đó có giải mã máy khác bằng khóa riêng phù hợp.

+0

Tôi đã đọc câu hỏi như đã đưa ra một giải pháp thay thế để mã hóa chuỗi cứng ngay từ đầu. – Serapth

+0

Nó không phải là cục bộ cho máy, dữ liệu được mã hóa kết thúc bằng xml và sau đó được truyền tới một máy khác (mặc dù không có kết nối trực tiếp). – Nick

+0

+1 Tôi hoàn toàn đồng ý với Pidgin. – rook

2

Bài viết này trên securing SQL connection strings chỉ nên áp dụng để lưu trữ mật khẩu được mã hóa, nơi bạn cho phép hệ điều hành xử lý mã hóa của hạt muối để giải mã.

6

Để tôi giải quyết câu hỏi cuối cùng của bạn trước tiên.

"Điều này có đủ an toàn không?"

Chỉ người duy nhất có thể trả lời đó là bạn. Không ai ở đây biết những gì "đủ an toàn" có nghĩa là trong bối cảnh của ứng dụng của bạn.

Bạn đang xây dựng một ứng dụng để giữ nhật ký của các cô gái vị thành niên? Chắc chắn, nó sẽ là "đủ an toàn".

Bạn đang xây dựng một ứng dụng để mã hóa thông tin hoặc xác thực cho hệ thống bảo mật cấp quân sự? Không, thậm chí không gần.

Bạn chỉ có thể dựa vào một loại bảo mật nếu bạn định lưu trữ mật khẩu trong mã nguồn của mình và do đó có thể thực thi được, và đó là bảo mật do tối nghĩa.

Nếu vấn đề của bạn là bạn không thể, hoặc sẽ không lưu trữ mật khẩu trong mã nguồn, sau đó di chuyển nó vào một dll riêng biệt không có gì, bạn vừa chuyển vấn đề đến một dự án khác.

Tuy nhiên, tôi đang tự hỏi về điều gì đó. Bạn nói "Tôi phải mặc định một cái gì đó". Là nó? Bạn đang cố gắng lưu trữ giá trị mặc định cho chuỗi mật khẩu bảo mật trong mã nguồn? Làm thế nào về "THISISNOTAPASSWORD"?

+6

Tội phạm mạng rất xa để hiểu biết cũng bị lừa bởi THISISNOTAPASSWORD. Thay vào đó tôi đề nghị bạn sử dụng tâm lý học và đi với THISISAPASSWORD. – Serapth

+0

Nếu tôi vấn đề hack này đã được giao cho tôi, tôi sẽ thực sự bối rối với trò chơi tâm lý này. : P – Fraga

+0

+1 để kiểm tra xem 'đủ bảo mật' là gì. –

2

Nghe có vẻ như tôi có lẽ bạn nên sử dụng giải pháp PKI thay vì mã hóa/giải mã. Nếu bạn có một ứng dụng khác cần tiêu thụ dữ liệu được mã hóa, thì bạn có thể có một cặp khóa cho ứng dụng đó và cung cấp khóa công khai cho ứng dụng đang thực hiện mã hóa. Bằng cách đó bạn vẫn giữ dữ liệu của bạn an toàn, nhưng không giới thiệu một loạt các mã bổ sung mà cuối cùng không cung cấp cho tất cả những gì bảo vệ nhiều.

Một tìm kiếm google nhanh chóng đã cho tôi this bài viết Mã dự án mà nói về việc sử dụng Certificate Store Windows trong Net

6

Eric Lippert của You Want Salt With That? (original blog post)

Cũng đọc bài của mình để Use the right tool for the job nơi ông kết thúc với các mẹo sau:

0) Nếu bạn có thể, chỉ cần không đến đó. Mã hóa là cực kỳ khó khăn để có được quyền và thường xuyên là giải pháp sai ở nơi đầu tiên. Sử dụng các kỹ thuật khác để giải quyết vấn đề bảo mật của bạn.

1) Nếu vấn đề là khách hàng không đáng tin cậy thì không xây dựng giải pháp bảo mật yêu cầu tin tưởng khách hàng.

2) Nếu bạn có thể sử dụng các bộ phận có sẵn thì hãy làm như vậy.

3) Nếu bạn không thể sử dụng các bộ phận có sẵn và phải sử dụng hệ thống mật mã thì không sử dụng hệ thống mật mã mà bạn không hiểu đầy đủ.

4) Nếu bạn phải sử dụng một hệ thống mật mã mà bạn không hiểu đầy đủ, thì ít nhất không sử dụng nó để giải quyết các vấn đề mà nó không được thiết kế để giải quyết.

5) Nếu bạn phải sử dụng một hệ thống mã hóa để trượt qua cây, thì ít nhất không cho phép khách hàng có khả năng thù địch chọn thư được mã hóa. Chọn mã thông báo cho chính bạn. Nếu mã thông báo phải bao gồm thông tin từ khách hàng thì hãy vệ sinh nó theo một cách nào đó; yêu cầu nó chỉ là văn bản ASCII thẳng, chèn khoảng trắng ngẫu nhiên, v.v.

6) Nếu bạn phải cho phép khách hàng chọn mã thông báo, thì không mã hóa chính mã thông báo đó. Ký băm mã hóa an toàn của mã thông báo. Nó khó khăn hơn nhiều cho kẻ tấn công để chọn một mã thông báo mà tạo ra một băm mong muốn.

7) Không sử dụng cùng một cặp khóa để mã hóa thư gửi đi như bạn thực hiện để bảo vệ thư đến. Nhận một cặp chìa khóa cho mỗi hoạt động hợp lý khác nhau mà bạn sẽ thực hiện.

8) Mã hóa thông tin liên lạc theo cả hai cách.

9) Xem xét có cơ chế thu hồi, để khi bạn biết rằng Eve đang tấn công bạn, bạn có thể ít nhất thu hồi giấy phép của mình. (Hoặc bạn có thể thu hồi giấy phép bị xâm nhập đã biết, v.v.)

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