2012-03-01 2 views
48

Tôi đang tìm cách lưu trữ khóa API một cách an toàn trong ứng dụng WP7. Khóa là một chuỗi và hiện đang được mã hóa cứng vào mã (xem bên dưới). Tôi biết rằng ai đó có chương trình phản xạ có thể dễ dàng xem nội dung này. Có cách nào tốt hơn để đóng gói khóa này như một phần của ứng dụng của tôi không? Tài nguyên có an toàn hơn không?Làm cách nào để nhúng một chuỗi tĩnh (khóa) vào C#?

string key = "DSVvjankjnersnkaecjnDFSD44VDS23423423rcsedzcadERVSDRFWESDVTsdt"; 

(Đây không phải là thực sự là chìa khóa;))

Cảm ơn bạn trước.

+0

bạn có thể lưu trữ các loại dữ liệu này trong tệp .config –

Trả lời

21

Hãy xem Safeguard Database Connection Strings and Other Sensitive Settings in Your Code, đây là một tài liệu tốt. Câu hỏi của bạn nằm trong phần "Ẩn khóa trong mã nguồn ứng dụng".

Trích:

Nếu bạn xác định khóa trong ứng dụng, ngoài Obfuscating lắp ráp, cố gắng không để lưu trữ các byte trọng thực tế trong mã nguồn. Thay vào đó, hãy triển khai logic tạo khóa bằng cách sử dụng các đặc tính liên tục, chẳng hạn như thuật toán mã hóa, kích thước khóa, cụm từ mật khẩu, vectơ khởi tạo và muối (xem ví dụ tại Encrypt and Decrypt Data Using a Symmetric (Rijndael) Key). Điều này sẽ giới thiệu một lớp bổ sung của indirection, do đó, khóa sẽ không thể truy cập được bằng cách đơn giản bán các biểu tượng từ nhị phân ứng dụng. Miễn là bạn không thay đổi logic tạo khóa và các đặc tính quan trọng, khóa kết quả được đảm bảo giống nhau. Nó cũng có thể là một ý tưởng tốt không nên sử dụng các chuỗi tĩnh như các đặc tính tạo ra khóa, mà là xây dựng chúng một cách nhanh chóng. Một gợi ý khác là xử lý việc lắp ráp giống như cách lưu trữ dữ liệu, có nghĩa là, bằng cách áp dụng các ACL thích hợp. Và chỉ sử dụng tùy chọn này làm phương sách cuối cùng, khi không có kỹ thuật bảo vệ dữ liệu nào khác hoạt động và lựa chọn duy nhất của bạn là để lại dữ liệu nhạy cảm không được mã hóa.

+9

Bạn có muốn tóm tắt nội dung ở đây không? Điều này sẽ làm cho câu trả lời có giá trị hơn như một độc lập (ví dụ: trong trường hợp liên kết bị lỗi). –

+2

Điểm tốt. Tôi sẽ tóm tắt các bước được mô tả sau khi làm việc. – maka

5

Bạn có thể mã hóa khóa Api với ProtectedData rồi giải mã trong thời gian chạy. Đây là hướng dẫn tốt về cách mã hóa dữ liệu trong Windows Phone: Encryption in Mango

+1

Tôi đã thử nhưng nó chỉ ra rằng bạn không thể sử dụng ProtectedData để mã hóa một cái gì đó trong một máy tính và giải mã nó trong một số khác. Như bạn có thể thấy như sau: http://stackoverflow.com/questions/23124000/unable-to-decrypt-data-on-second-computer – Entrodus

0

Có thể bạn có thể mã hóa dữ liệu đó trước khi lưu và lưu trong app.config. Và trong khi đọc nó giải mã nó bằng cách sử dụng cùng một thuật toán.

0

Nó không phải là một câu trả lời có thể, nhưng chắc chắn đó là một gợi ý:

Lưu trữ khóa được mã hóa trong một db. Và lưu trữ "mật khẩu db" được mã hóa trong app.config.

  1. Sử dụng hai thuật toán mã hóa/giải mã chuỗi thích hợp, giả sử thuật toán x và y.
  2. Đặt mật khẩu db được mã hóa trong app.config trước đó để xuất bản.
  3. Decypt app.config password (algo y) để kết nối db để lấy chuỗi mã hóa mới (thực tế).
  4. Đóng kết nối và hủy chuỗi mới bằng thuật toán x nếu phản xạ/v.v. không chạy.
  5. Sử dụng.
  6. Vứt bỏ đối tượng chứa chuỗi.
+1

Lựa chọn thuật toán (được hiển thị thông qua phản chiếu) không phải là vấn đề nhưng chìa khóa sự quản lý. Ví dụ bạn không nói ở bướC# 3, nơi khóa được lưu trữ. Vì vậy, ngay cả khi ai đó thực hiện đề xuất của bạn, họ vẫn sẽ có cùng một câu hỏi mà OP có. Bạn lưu trữ khóa ở đâu? –

+0

Khóa mã hóa cửa hàng trong một db. Và lưu trữ "mật khẩu db" được mã hóa trong app.config. Tôi vẫn cập nhật câu trả lời của mình. (Nếu nhà phát triển sử dụng thuật toán mã hóa tùy chỉnh được mã hóa cứng trong ứng dụng của mình, và sau đó làm xáo trộn nó, quá khó để hiển thị nó thông qua sự phản ánh.) –

+0

@LostInLib: Conrad có lẽ là đề cập đến khóa cần thiết để giải mã mật khẩu app.config. – Groo

10

Tôi đã đọc qua tất cả các câu trả lời này và tôi không nghĩ có cách nào bạn có thể nhúng một cách an toàn - bất kể bạn đặt ở đâu hoặc làm cách nào bạn làm xáo trộn nó. Miễn là nó trong XAP của bạn và được giải mã trong ứng dụng thì nó sẽ luôn luôn có sẵn để hack.

Nếu bạn cần gửi chìa khóa bên trong xap với mức độ bảo vệ hợp lý, thì tôi nghĩ @ câu trả lời của maka mang lại đặt cược tốt nhất của bạn - làm cho nó ngon nhất có thể - nhưng đừng nghĩ rằng điều này sẽ giúp bạn an toàn - tức là không làm điều này cho các ứng dụng ngân hàng di động của bạn!

Hoặc, nếu bạn thực sự cần bảo mật thì không hoạt động chỉ trong ứng dụng - hãy sử dụng máy chủ web. Ví dụ, nếu bạn đang làm một ứng dụng Facebook và cần thiết để bảo vệ khóa bí mật của bạn bằng cách nào đó, thì bạn sẽ cần phải chuyển hướng người dùng từ ứng dụng của bạn đến một trang web trên máy chủ của bạn để xác thực. Sau đó, trang web đó sẽ cần hướng dẫn người dùng thông qua quá trình nhận mã thông báo truy cập - và sau đó chỉ cần mã thông báo truy cập đó (cùng với appid công khai) sẽ cần quay lại ứng dụng của bạn. Và đối với những dịch vụ web yêu cầu kiến ​​thức về khóa bí mật để đi cùng mọi cuộc gọi, thì tôi sợ mọi cuộc gọi đơn lẻ có thể sẽ cần phải đi qua máy chủ của bạn.