2012-10-27 33 views
16

thể trùng lặp:
hiding strings in Obfuscated codeObfuscation: ẩn giá trị mã hóa cứng trong java

Tôi đang cố gắng để che giấu một chút một số Strings tĩnh của ứng dụng của tôi để làm cho nó khó khăn hơn để dịch ngược , cách này giống như các hằng số như các thuật toán thuật toán tên khó tìm hơn trong mã bị xáo trộn.

tôi đã xem xét những thứ như:

String CONCAT= "concat"+"string"; 
String RAW_STRING= "raw_string"; 
String FROM_BYTES=new String("from_bytes".getBytes()); 
String FROM_CHARS=new String(new char[]{'f','r','o','m','_','c','h','a','r','s'}); 
String FROM_CHAR2=new String(new char[]{102,114,111,109,95,99,104,97,114,115,95,50}); 

Và hai lựa chọn cuối cùng có vẻ là "đậm" hơn so với tùy chọn nguyên nhưng tôi tưởng tượng có những cách tốt hơn để làm điều này.

Làm cách nào để cải thiện điều này? Cảm ơn

+1

Tôi chưa bao giờ được lập trình cho Android, tuy nhiên tôi không thể thấy điểm của câu hỏi. Nếu người dùng không biết cách dịch ngược, chỉ có thể đọc mã thông qua Notepad, bạn chỉ cần đặt một số tên thuật toán chưa sử dụng, và người đó sẽ không biết cái nào thực sự có liên quan. Nếu anh ta biết cách dịch ngược, thì không có sự can thiệp nào có thể ngăn không cho anh ta thay thế cuộc gọi thư viện (tôi đoán bạn sử dụng một thư viện nổi tiếng với tên phương thức nổi tiếng để khởi tạo mật mã) với một Hệ thống. out.println. – ignis

+0

Tôi đang ẩn các loại dây như vậy bằng chức năng gradle đơn giản. Nó chỉ bảo vệ khỏi mắt thường, nhưng trong mọi trường hợp, nó tốt hơn không có gì: https://gist.github.com/shomeser/68f4fe360be0edac95e4 –

Trả lời

9

Thứ nhất, bạn không nên chỉ viết

String FROM_CHAR2=new String(new char[]{102,114,111,109,95,99,104,97,114,115,95,50}); 

Đó là một cho-đi chết mà mảng char thực sự là một String.

Bạn có thể làm một sự kết hợp của các nội dung sau:

  1. đưa bạn "String" trong một int [] array
  2. hoặc thậm chí tốt hơn, phá vỡ chuỗi của bạn thành nhiều mảng int
  3. tính toán/thao tác các giá trị của mảng ở các giai đoạn khác nhau của ứng dụng, vì vậy giá trị của nó sẽ chỉ hợp lệ tại một khoảng thời gian nhất định trong thời gian chạy, đảm bảo rằng nó sẽ không được giải mã một cách tò mò bằng cách giải mã mã của bạn
  4. truyền mảng qua lại, thông qua các biến cục bộ, bac k tới các biến mẫu, vv, trước khi chuyển đổi mảng thành một mảng đơn được chuyển đến hàm tạo String
  5. ngay lập tức đặt Chuỗi thành rỗng sau khi sử dụng, chỉ để giảm thời gian Chuỗi thực tồn tại trong thời gian chạy
+0

Bất kỳ mẫu hoặc mã ví dụ nào cho # 3? # 5 giúp đỡ như thế nào? – Nicholas

+0

# 5 giúp vì nếu ai đó có thể dịch ngược mã của bạn, điều đó có nghĩa là họ cũng có thể chạy nó, đặt cờ trình gỡ lỗi vào địa điểm, v.v. Vì vậy, bạn cũng nên tránh kiểm tra thời gian chạy. Điều này có nghĩa là chuỗi thời gian thực của bạn tồn tại ít hơn, an toàn hơn là từ con mắt tò mò. – Kai

+0

cho # 3, tôi đã không đi xa này bản thân mình, nhưng bạn có thể thử [this] (http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/658ab629-e603-4e6f- 985c-2bb8c1669b27 /) _or_ sử dụng một cái gì đó như [jzlib] (http://www.jcraft.com/jzlib/) để "zip" Strings của bạn vào mảng byte và giải nén chúng khi cần. Không sử dụng lib zip của Android vì tên phương thức của nó không thể bị làm xáo trộn, làm cho toàn bộ doanh nghiệp trở nên khá rõ ràng. – Kai

2

tôi muốn thiết lập các giá trị trong (lớp) initializer tĩnh nhờ sủ dụng một giải mã algo Something như

class ... 
    String CONCAT; 

    static { 
    CONCAT = uncrypt ("ahgsdhagcf"); 
    } 

nơi uncrypt có thể thực sự là một algo unencryption tốt hay hơi yếu một decode base64 .

Trong mọi trường hợp, bạn cần một chương trình đơn giản để mã hóa chuỗi của bạn trước tiên.

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