2011-10-31 24 views
7

Tôi có một mã hóa và giải mã thông thường mã hóa trong một trong các ứng dụng Android của tôi. Điều này về cơ bản là giải mã một chuỗi được tìm nạp thông qua. cuộc gọi từ xa. Đương nhiên "khóa bí mật" được lưu trữ trong mã, nhưng bất kỳ ai có apktool rõ ràng có thể thấy mã và xem khóa bí mật của tôi.Giữ bí mật phím SECRET - trong ứng dụng Android .. bất kỳ ý tưởng

Có cách nào để mã hóa tất cả mã Java sao cho ngay cả khi không biên dịch nó sẽ không đọc được/dễ hiểu?

Tôi đã nghe nói về ProGuard, nhưng khi đọc về nó, dường như không đủ cho mục đích này.

+2

Câu hỏi đặt ra là tại sao chuỗi được mã hóa? Nếu nó là để vận chuyển và bảo mật lưu trữ máy chủ thì sử dụng mã hóa khóa công khai. Nếu bạn muốn "ẩn" nó khỏi người dùng thì bạn sẽ không may mắn vì mọi thứ ứng dụng của bạn có thể "nhìn thấy" để người dùng có thể. –

+0

Chuỗi được mã hóa để ẩn vị trí của một tệp được truyền trực tuyến - ý định là làm xáo trộn và ít nhất khiến người dùng thông thường/người viết kịch bản khó tải xuống mp3 một cách độc lập với ứng dụng. Tôi biết những gì bạn nói và hoàn toàn hiểu rằng bất cứ điều gì ứng dụng có thể nhìn thấy - bất cứ ai xác định đủ có thể gỡ lỗi, giải mã hoặc dịch ngược - Tôi chỉ cố gắng làm cho nó khó khăn hơn. Có người xác định sẽ vẫn đi qua tất cả những điều đó và thành công. Không có vấn đề gì .. chỉ cần giữ nguyên kịch bản lệnh cơ bản .. – SpacialWise

+2

Tại sao không có máy khách tạo cặp khoá và gửi khóa công khai của nó tới máy chủ với yêu cầu? –

Trả lời

4

Bạn không bao giờ nên đặt khóa bí mật bên trong mã. Biên dịch mã có thể dễ dàng đảo ngược thiết kế và bất cứ ai với một trình gỡ lỗi có thể móc đến điểm mà khóa thực tế được tạo ra. Bảo mật luôn dựa vào thuật toán, giả định rằng mã máy khách là công khai và kẻ tấn công tiềm năng có một bản sao.

Ẩn các chữ trong mã chỉ trì hoãn kẻ tấn công trong quá trình lấy khóa, nhưng nó không ngăn cản nó theo bất kỳ cách nào.

+0

Vì vậy, các đề xuất của bạn là gì? – SpacialWise

+0

Có thể có một màn hình cấu hình để người dùng có thể xác định psw riêng của mình. Sau đó, bạn lưu trữ một băm của usr pasw, và khi ứng dụng khởi chạy, psw được yêu cầu. Nếu băm psw khớp với băm được lưu trữ, thì bạn cấp quyền truy cập cho người dùng. Bạn cũng có thể phát hành khóa cho người dùng, lưu trữ băm trong DB của mình và cho phép họ xác thực ứng dụng của họ khi sử dụng đầu tiên trực tuyến. –

0

Tôi không phải là chuyên gia bảo mật, nhưng tôi biết rằng ngôn ngữ biên dịch VM có thể dễ dàng dịch ngược bạn có thể cố gắng làm xáo trộn mã của bạn bằng ProGuard nhưng vẫn có thể đọc được, tôi khuyên bạn nên cố gắng lưu và mã hóa bằng cách sử dụng Java Crypto, loại câu hỏi này đã được hỏi trước khi tương tự như Android Crypting Database hoặc Encrypt Information in Android, tôi không mong đợi để trả lời câu hỏi của bạn nhưng cung cấp cho bạn một dòng hướng dẫn nơi để đi từ bây giờ.

+0

Cảm ơn bạn Necronet. Tôi đã đọc một số bài viết ở đây mà không có một giải pháp dứt khoát .. Tôi sẽ kiểm tra những cái bạn đã liên kết. – SpacialWise

0

bạn thay vì có thể tạo ra một chìa khóa mới mỗi khi bạn cần lấy chuỗi

sau đó bạn sẽ cần phải làm một cuộc trao đổi quan trọng với một giấy chứng nhận mã hóa cứng (đó là an toàn nếu được thực hiện đúng cách)

hoặc chỉ sử dụng SSL nếu nó chỉ an toàn khi đang chuyển tuyến

+1

Cách tiếp cận này nghe có vẻ hợp lý .. tạo ra một khóa mới mỗi lần có thể thực hiện được, nhưng tôi không quen với trao đổi khóa với chứng chỉ được mã cứng. Bạn có thể xây dựng thêm hoặc chỉ cho tôi theo một hướng? Tôi ' – SpacialWise

1

Có thể đọc tất cả mã trên máy khách. Điều tốt nhất bạn có thể làm là làm cho việc tìm chìa khóa trở nên khó khăn hơn.

Đề xuất: sẽ có một số chuỗi văn bản trong mã của bạn, như "Vui lòng chờ trong khi yêu cầu của bạn đang xử lý ..." Tìm một thư như vậy và tạo mảng byte để thay đổi thư đó thành khóa thực của bạn bằng XORing mảng byte với chuỗi văn bản.

ví dụ: "sóc" XOR [16 1D 10 19 1A 13 0B 18] => "voi"

Chỉ "sóc" và mảng byte thực sự xuất hiện trong mã của bạn.

+0

Xin chào! Có điều này là dọc theo dòng của những gì tôi đã suy nghĩ ban đầu. Về cơ bản có một vài thói quen (sử dụng các thuật toán) để tạo khóa ra khỏi dữ liệu bên trong string.xml và cũng có một số biến được nhúng ngẫu nhiên khác. Kết hợp tất cả điều này vào một số phương thức được nhúng trong các lớp riêng biệt. Sau đó, cuối cùng sử dụng ProGuard mà sẽ làm cho truy tìm những chức năng cụ thể/thói quen đang làm khó khăn hơn .. – SpacialWise

+0

Tôi biết ai đó vẫn có thể tìm ra ngay cả trong trường hợp đó, nhưng nó tốn nhiều thời gian hơn - lấy nó chỉ đơn giản là dịch ngược và đọc, phải theo dõi mã trong vài phút. – SpacialWise

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