2012-04-18 22 views
9

Tôi cần lưu trữ khóa chuỗi riêng tư bên trong ứng dụng. Giá trị của nó sẽ không bao giờ thay đổi và được đặt thủ công trong mã. Tôi rõ ràng không thể lưu trữ nó như là một phương pháp kỹ thuật đảo ngược sẽ tiết lộ nó, ngay cả với obfuscation được áp dụng.Giải pháp chống hack cho khóa bí mật trong ứng dụng Android?

Bạn đề xuất tôi bảo vệ khóa riêng tư này bằng cách nào?

Tôi mặc dù lưu nó vào cơ sở dữ liệu, nhưng cơ sở dữ liệu cũng có thể được rút ra khỏi điện thoại.

PS. khóa này là một tham số đặc biệt nên một phương pháp quan trọng và điều quan trọng là nó vẫn không được ai biết đến! Nó không phải là một chìa khóa giải mã. Chuỗi này sẽ được sử dụng làm tham số cho phương thức mã hóa (md5 hoặc tương tự) và sau đó kết quả sẽ được gửi đến dịch vụ Internet của chúng tôi.

EDIT

Xin lỗi, để làm cho nó quá phức tạp. Tôi nghĩ tôi có thể nhận được câu trả lời với càng ít thông tin càng tốt.

Ứng dụng này sẽ cho phép người dùng gửi một số văn bản tới dịch vụ Internet sau đó đăng văn bản đó lên trang web. Chúng tôi cần đảm bảo rằng văn bản được gửi qua điện thoại Android vì bất kỳ tập lệnh robot web nào đều có thể bắt chước điện thoại Android và đăng spam. Vì các phương thức giống như captcha không được chào đón trên điện thoại di động, sẽ có khóa bí mật sẽ được đưa qua md5 (với một số thứ khác) để tạo mã băm. Mã băm này sẽ được gửi đến một dịch vụ Internet. Dịch vụ Internet sẽ sử dụng cùng một khóa để nhận kết quả md5 và sau đó so sánh nó để xem người gửi có phải là điện thoại di động hay một số rô bốt hay không.

Đây thực sự là số tiền tối đa tôi được phép nói. Tôi hy vọng nó là đủ.

+7

"điều quan trọng là nó vẫn không được ai biết đến" Nếu nó thực sự quan trọng, bạn không thể đưa nó vào ứng dụng. Nếu không, kẻ tấn công chỉ có thể bước qua mã của bạn bằng trình gỡ lỗi, dừng tại thời điểm mã của bạn sử dụng chuỗi và kiểm tra nội dung. Kẻ tấn công không cần biết cách giải mã chuỗi, nhưng chỉ cần cài đặt các công cụ dành cho nhà phát triển Android để cho phép mã của bạn thực hiện giải mã thay thế. –

+0

@AdamMihalcin Không, chuỗi này sẽ được sử dụng ** để mã hóa ** và sau đó kết quả sẽ được gửi đến một số dịch vụ Internet khác. Điều này có thay đổi gì không? – sandalone

+0

Tôi đồng ý, nếu bạn sử dụng chuỗi như pswd/TAN hoặc tương tự, bạn có thể xem xét cách ngân hàng thực hiện việc này bằng cách gửi mã sử dụng một lần tới thiết bị di động và chỉ sử dụng mã này - mỗi khi người dùng muốn truy cập anh ta nhận được một cái mới. @Adam Mihalcin, ý bạn là gì? Tôi hiểu rằng người ta có thể XEM vào mã, tuy nhiên, gỡ lỗi một ứng dụng đã tải, làm thế nào điều này có thể? – user387184

Trả lời

10

Tôi khuyên bạn nên suy nghĩ lại kiến ​​trúc bảo mật của mình. Mọi thứ được vận chuyển với ứng dụng đều có thể phát hiện được. (Ví dụ: thư viện xác thực giấy phép của Android được thiết kế sao cho khóa công khai được gửi cùng với ứng dụng.)

Một khả năng là ứng dụng truy xuất khóa từ máy chủ (qua ổ cắm an toàn hoặc kết nối https). Điều này rõ ràng sẽ yêu cầu các ứng dụng gửi đến máy chủ một số loại nhận dạng/xác nhận (có lẽ dựa trên đầu vào của người dùng).

Nếu bạn đang sử dụng khóa để mã hóa, hãy xem xét cách mã hóa khóa công khai được yêu cầu hoạt động. Ứng dụng của bạn phải có khóa công khai; dịch vụ internet sau đó có thể giải mã bằng khóa riêng phù hợp.

+0

Xin chào Ted, tôi đã chỉnh sửa câu hỏi. "Chuỗi này sẽ được sử dụng làm tham số cho phương thức mã hóa (md5 hoặc tương tự) và sau đó kết quả sẽ được gửi đến dịch vụ Internet của chúng tôi." – sandalone

+0

@sandalone Tôi thêm một chút vào câu trả lời của tôi để giải quyết chỉnh sửa của bạn. –

+0

Đã chỉnh sửa lại câu trả lời. – sandalone

4

Nếu bạn có thể giải quyết bằng nhận xét của @ Adam, có ít nhất một giải pháp mà tôi biết để duy trì giá trị Chuỗi trên điện thoại theo cách ... liên tục, có nghĩa là giá trị sẽ tồn tại khi gỡ cài đặt/cài đặt lại ứng dụng của bạn (khôi phục cài đặt gốc sẽ xóa nó), nhưng vẫn "ẩn" cho người dùng (ví dụ: được lưu trữ trong bộ nhớ riêng của hệ thống chứ không phải trên thẻ SD).

Bạn có thể sử dụng các thiết lập hệ thống cung cấp nội dung để lưu trữ các giá trị như sau:

final String myKey = "verySecretKey"; 
final String myValue = "verySecretValue"; 
final boolean isSuccess = System.putString(getContentResolver(), myKey, myValue); 

Và để lấy nó, bạn có thể làm:

myValue = System.getString(getContentResolver(), myKey); 

Và vâng, trên một chiếc điện thoại bắt nguồn từ một tiện dụng người dùng có thể nắm giữ giá trị tồn tại, nhưng trong trường hợp đó không có gì là thánh nữa và nhận xét của @ Adam sẽ hợp lệ: Bạn không nên lưu trữ dữ liệu trên thiết bị.

+0

Đã chỉnh sửa lại câu trả lời. – sandalone

+0

Điều này thực sự có hiệu quả không? Nó có vẻ giống như một hack, và một cái gì đó Android sẽ không cho phép (hoặc có thể phá vỡ trong một phiên bản tương lai). Settings.System có nghĩa là cho ... tốt, cài đặt hệ thống, không phải ứng dụng lưu trữ cá nhân. – Tom

+0

Có, nó hoạt động và tôi cũng hy vọng nó hoạt động, đặc biệt là khi có một API công khai tài liệu cho nó. Ngoài ra, kiểm tra tài liệu (http://developer.android.com/reference/android/provider/Settings.System.html), người ta có thể lưu ý rằng phương thức 'putString' dường như được kích hoạt cho" khóa đích chung " lưu trữ giá trị ", trong khi các phương thức' put ... 'khác dường như được sử dụng để sửa đổi chủ yếu các khóa hiện có (nhưng đó có thể là vấn đề giải thích). – dbm

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