2009-01-14 30 views
17

Tôi đã nghĩ đến việc tạo ra một công cụ nhỏ. Nó không quan trọng những gì công cụ sẽ làm. Điều quan trọng, đó là công cụ sẽ cần lưu trữ một số thông tin nhạy cảm trên HDD của người dùng. EDIT: Thông tin sẽ được lưu trữ là thông tin của NGƯỜI DÙNG - Tôi không cố gắng bảo vệ nội dung của riêng mình, mà tôi phân phối với ứng dụng.Có một số loại bộ nhớ cục bộ bảo mật trên Windows không?

Tôi hiểu rằng tôi cần mã hóa thông tin này. Nhưng sau đó, tôi lưu trữ mật khẩu mã hóa ở đâu? Đó là một số loại đệ quy vô hạn ...

Vì vậy, có cách nào, để mã hóa thông tin trên cửa sổ và có cửa sổ quản lý mật khẩu một cách an toàn không? Khi tôi nói các cửa sổ, tôi có nghĩa là Windows XP SP2 hoặc mới hơn.

Tôi cũng nên lưu ý rằng người dùng trên cùng một hệ thống không được có quyền truy cập vào thông tin người dùng khác (ngay cả khi cả hai đều đang chạy ứng dụng của tôi).

Tôi đang tìm cả hai giải pháp .NET 2.0 (C#) và bản địa (C/C++) cho vấn đề này.

Trả lời

20

là có cách nào, để mã hóa thông tin trên cửa sổ và có cửa sổ quản lý mật khẩu một cách an toàn không?

CryptProtectData: http://msdn.microsoft.com/en-us/library/windows/desktop/aa380261(v=vs.85).aspx

Sử dụng từ NET: http://msdn.microsoft.com/en-us/library/aa302402.aspx

Về mặt lịch sử, Protected Storage (có sẵn trong XP, read-only trong vista +): http://msdn.microsoft.com/en-us/library/bb432403%28VS.85%29.aspx

+3

Đối với .NET 2.0+ sử dụng lớp System.Security.Cryptography.ProtectedData thay vì liên kết thứ 2 của @ bobince. – devstuff

3

Bạn có thể sử dụng cơ sở mã hóa gốc. Đặt thuộc tính mã hóa trên thư mục hoặc tệp của bạn (từ trang thuộc tính, nhấp vào nút "nâng cao"). Sau đó, bạn có thể đặt người dùng có thể truy cập tệp (theo mặc định, điều này chỉ bao gồm trình tạo tệp). Ưu điểm lớn của giải pháp này là nó hoàn toàn minh bạch từ ứng dụng và quan điểm của người dùng.

Để làm điều đó theo lập trình: sử dụng API Win32, hãy gọi EncryptFile() trên thư mục mà bạn muốn lưu trữ dữ liệu nhạy cảm trên mỗi người dùng của mình. Từ bây giờ, tất cả các tệp mới được tạo trong thư mục này sẽ được mã hóa và chỉ có thể đọc được bởi người tạo của họ (đó sẽ là người dùng hiện tại của ứng dụng của bạn). Hoặc bạn có thể sử dụng cờ FILE_ATTRIBUTE_ENCRYPTED trên các tệp riêng lẻ tại thời điểm tạo. Bạn có thể kiểm tra thông tin mã hóa từ trình khám phá trên trang thuộc tính của tệp và thấy rằng các tệp do ứng dụng tạo được mã hóa chính xác và bị hạn chế đối với người dùng tương ứng của chúng. Không có mật khẩu để lưu trữ hoặc sử dụng, mọi thứ đều trong suốt.

Nếu bạn muốn ẩn dữ liệu khỏi tất cả người dùng, bạn có thể tạo người dùng đặc biệt cho ứng dụng và mạo danh nó từ ứng dụng của bạn. Điều này, cùng với ACL, là kỹ thuật may mắn trên Windows cho các dịch vụ hệ thống.

+0

Tôi có thể đặt mã này từ mã không? Giống như từ .NET C# hoặc ứng dụng gốc C++? – Paulius

+0

Điều đó không giúp ích gì khi phân phối mã/công cụ cho người khác ... – xan

+0

Vâng, thông tin phải được người dùng nhập trước và sau đó ứng dụng của tôi sẽ cần lưu trữ an toàn. Vì vậy, nếu tôi có thể tạo tệp như vậy từ bên trong ứng dụng của tôi - nó có thể hoạt động. – Paulius

2

Bạn có thể muốn xem Bộ nhớ cách ly, đây là cách lưu trữ cài đặt và dữ liệu khác trên dữ liệu mỗi ứng dụng một cách tự động. Xem exampleMSDN.

Đây là giải pháp thay thế để lưu trữ cài đặt bình thường trong sổ đăng ký, tốt hơn trong nhiều trường hợp ... Tôi không chắc chắn cách dữ liệu được lưu vào tệp, vì vậy bạn cần kiểm tra, bạn sẽ không muốn nó có thể truy cập được, thậm chí được mã hóa, cho người dùng khác. Từ bộ nhớ chỉ ứng dụng. đã tạo ra bộ nhớ có thể mở nó - nhưng điều đó cần kiểm tra.

Edit:

Từ bộ nhớ khi tôi cuối cùng sử dụng này, một cách tiếp cận tốt nhất là viết một lớp học "Setting" mà xử lý tất cả các thiết lập vv trong ứng dụng của bạn. Lớp này sau đó có tương đương với các phương thức Serialize và DeSerialize cho phép nó ghi tất cả dữ liệu của nó vào một tệp tin IsolatedStorage, hoặc tải chúng trở lại. Ưu điểm của việc thực hiện nó theo cách này là bạn có thể sử dụng các thuộc tính để đánh dấu các bit của nguồn và sau đó có thể sử dụng Grid Property để nhanh chóng cho phép bạn điều chỉnh các thiết lập của người dùng (Grid Property xử lý các thuộc tính của lớp tại lúc này. thời gian chạy sử dụng sự phản chiếu).

+0

Tôi đang đọc tài liệu ngay bây giờ. Điều này có vẻ đầy hứa hẹn ... – Paulius

+4

Từ MSDN: "Không sử dụng bộ nhớ riêng để lưu trữ các bí mật có giá trị cao, chẳng hạn như khóa hoặc mật khẩu không mã hóa, bởi vì bộ nhớ riêng biệt không được bảo vệ khỏi mã đáng tin cậy, từ mã không được quản lý hoặc từ người dùng đáng tin cậy máy tính." – Casebash

+0

@Casebash Cảm ơn bạn đã cập nhật. – xan

-5

Erm băm mật khẩu? Bạn không cần phải lưu trữ các giao dịch thực sự bất cứ nơi nào trên máy tính chỉ là một mật khẩu băm (có thể muối quá). Sau đó, khi người dùng nhập mật khẩu của họ, bạn thực hiện các hoạt động tương tự trên đó và so sánh nó với một băm bạn đã lưu trữ trên đĩa.

+0

Đó là vấn đề - tôi không muốn hỏi người dùng mật khẩu. Điểm của ứng dụng của tôi, là nếu người dùng đã đăng nhập vào Windows - thì anh ta là người mà anh ta nói.Vì vậy, điều này sẽ không làm việc cho tôi. – Paulius

+0

Nếu người dùng đã đăng nhập thì tại sao bạn lại bận tâm sử dụng mật khẩu ngay từ đầu? – liggett78

+0

Bởi vì thông tin sẽ được lưu trữ trong một tệp bên ngoài (hoặc bất kỳ thứ gì) không được người dùng khác truy cập (nếu ai đó đăng nhập vào tài khoản cửa sổ của riêng mình). – Paulius

0

Tôi khuyên bạn nên xem Khối ứng dụng mã hóa thư viện doanh nghiệp. Kiểm tra số blog post này. Windows có một API bảo vệ dữ liệu được tích hợp sẵn để mã hóa dữ liệu, nhưng khối ứng dụng Crypto làm cho nó đơn giản hơn.

-4

Um, những gì bạn đang cố gắng đạt được chính xác là những gì DRM đã cố gắng đạt được. Mã hóa một cái gì đó sau đó cung cấp cho người sử dụng các phím (tuy nhiên obfuscated) và mật mã. Họ đã làm nó với DVD. Họ đã làm nó với Blu-Ray. Họ đã làm nó với iTunes.

Những gì bạn đang đề xuất thực hiện sẽ không bao giờ được bảo mật. Vị trí trung bình của bạn có thể sẽ không tìm ra, nhưng bất kỳ kẻ tấn công đủ năng lượng nào cũng sẽ làm việc đó và khám phá các khóa, thuật toán và giải mã dữ liệu.

Nếu tất cả những gì bạn đang làm là mã hóa dữ liệu người dùng thì hãy yêu cầu người dùng nhập mật khẩu của họ. Nếu bạn đang cố gắng bảo vệ dữ liệu nội bộ của mình khỏi người dùng đang chạy ứng dụng bạn đang S.O.L.

+0

S.O.L. là gì? Dù sao, tôi không cố gắng để đạt được điều tương tự như DRM. Tôi không cố mã hóa các tập tin MY, mà sau này tôi sẽ phân phối với ứng dụng - tôi cần một cách để mã hóa thông tin USER, HE/SHE sẽ nhập vào APP của tôi (thông tin cần được lưu trữ để sử dụng sau này từ bên trong của tôi) ứng dụng). – Paulius

+0

S.O.L. = "S ** t Outta Luck" –

3

Bạn nên cân nhắc sử dụng DPAPI cho mục đích này. Nó sẽ mã hóa dữ liệu của bạn bằng khóa đối xứng (nội bộ) đặc biệt trên cơ sở mỗi người dùng. Bạn thậm chí không cần yêu cầu mật khẩu trong trường hợp này, bởi vì những người dùng khác nhau trên hệ thống sẽ có các khóa khác nhau được gán cho họ.

Nhược điểm của nó có thể là bạn không thể khôi phục dữ liệu nếu người dùng bị xóa/Windows cài đặt lại (tôi tin rằng đây là trường hợp, không hoàn toàn chắc chắn). Trong trường hợp đó, mã hóa dữ liệu bằng khóa "tự tạo" bắt nguồn từ mật khẩu và lưu trữ mật khẩu trong registry/tệp được mã hóa bằng DPAPI.

+0

Liên kết tới các tài liệu cho .NET 2.0 trở lên: http://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata.aspx – liggett78

+0

Vâng, trong khi dữ liệu nhạy cảm, tôi có thể giả định một cách an toàn, người dùng có thể nhập lại dữ liệu trong trường hợp cài đặt lại windows. Sau khi tất cả, đó là cách tôi nhận được dữ liệu ở nơi đầu tiên - người dùng nhập vào nó, và sau đó ứng dụng của tôi chỉ tự động kỳ diệu nhớ nó. – Paulius

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