2009-02-11 92 views
16

Tôi đang làm việc trên dự án cần phải bảo vệ dữ liệu (tiết lộ mã không phải là vấn đề chính) tệp. Chúng tôi đang sử dụng Java + Netbeans. Có cơ sở nào tạo jar ở định dạng được mã hóa không? Chúng tôi cũng đang sử dụng sqlite cho cơ sở dữ liệu - vì vậy việc đặt tệp văn bản ở định dạng được mã hóa cũng không phải là tùy chọn thích hợp cho chúng tôi.Làm thế nào để tạo tệp Jar đã mã hóa?

+4

Thiết kế của bạn bị thiếu sót; vận chuyển dữ liệu nhạy cảm cùng với mã không phải là một ý tưởng thông minh. – Rob

+0

Đây là ứng dụng Desktop. Java được sử dụng cho khả năng tương thích nền tảng chéo. –

+3

Nếu bạn cần bảo vệ dữ liệu xem xét SqlCipher. Bạn có thể gửi tập tin DB đã được mã hóa nếu bạn muốn. –

Trả lời

20

Tạo JAR được mã hóa là không thể, vì JavaVM thực thi phải bằng cách nào đó có thể đọc dữ liệu mà nó muốn thực thi. Và tương tự như một máy ảo nó sẽ có thể cho bất cứ ai với các công cụ thích hợp và bí quyết để trích xuất tất cả dữ liệu từ JAR.

Nếu có thể mã hóa JAR, bạn cũng sẽ phải cung cấp một số khóa giải mã hoặc cơ sở cho máy khách muốn thực thi JAR đánh bại mục đích mã hóa.

Điều tốt nhất bạn có thể nhận được là làm xáo trộn, nhưng điều đó không có bảo mật hoặc rào cản thực sự đối với kẻ tấn công đầy tham vọng.

2

Một tùy chọn khác là tạo một JVM tùy chỉnh đã giải mã JAR khi đang di chuyển. Nhưng vấn đề tương tự vẫn là: tại một số điểm, các lớp Java JAR phải được giải mã để được JVM điều hành, và tại thời điểm đó chúng có thể được bắt và bỏ biên dịch.

Chưa kể rằng có JVM tùy chỉnh sau đó sẽ yêu cầu tất cả người dùng của bạn tải xuống JVM đó.

1

Bạn có thể sử dụng CipherOutputStream và CipherInputStream để tuần tự hóa các đối tượng Java vào đĩa ở định dạng được mã hóa. Điều này có thể là một tùy chọn mở để lưu dữ liệu.

7

Kosi2801 là khá nhiều. Điều duy nhất tôi có thể nghĩ về bạn có thể làm là như sau, nhưng nó xấu xí.

  1. Gửi một tệp JAR tiêu chuẩn nhỏ và tệp dữ liệu được mã hóa.
  2. Khi JAR chạy, nó giải mã (một số) tệp dữ liệu được mã hóa vào bộ nhớ (như thư mục chứa dữ liệu trong JAR, về cơ bản hệ thống tệp đơn giản trong bộ nhớ của các cặp con trỏ/chiều dài)
  3. Đặt lập trình nạp lớp của riêng bạn, khi được gọi, nhận các byte được mã hóa đúng từ JAR (sử dụng bảng giả FS được mô tả trong # 2), giải mã nó và sau đó tải dữ liệu lớp từ đó

Điều này sẽ cho phép bạn tải các lớp học. Bạn có thể làm điều tương tự (không có trình nạp lớp) để tải các tài nguyên khác.

Trong khi vui vẻ để thực hiện (đối với những người thích một thách thức) có một vài vấn đề với điều này:

  1. Bạn sẽ cần để có thể giải mã những thứ, vì vậy người dùng sẽ hoặc phải nhập một mật khẩu mỗi lần hoặc một cái gì đó tương tự. Nếu JAR biết đủ để giải mã nó là tự, thì bất cứ ai cũng có thể nhìn vào nó và tìm ra cách giải mã mọi thứ. Điều này có thể được giảm nhẹ bằng cách liên hệ với một máy chủ được biết đến tốt trên Internet để yêu cầu khóa giải mã (miễn là bạn thực hiện quy trình đó an toàn). Tất nhiên điều này đòi hỏi một 'kết nối mạng hoạt động bất cứ lúc nào ai đó muốn chạy chương trình.
  2. Mọi thứ kết thúc trong bộ nhớ. Nếu không có một JVM tùy chỉnh xử lý các bit nhỏ của mã byte được mã hóa (như Cameron McKay đã đề cập), các lớp sẽ kết thúc giải mã trong bộ nhớ chính tại một thời điểm nào đó. Trừ khi bạn dựa vào hệ điều hành để ngăn người khác đọc bộ nhớ đó, bạn đã thua trận chiến với bất kỳ ai có chút thời gian trên tay.Cùng một vấn đề về tài nguyên (chẳng hạn như hình ảnh/phông chữ/v.v) mà bạn cố gắng đọc ra khỏi một số kho lưu trữ được mã hóa.

Vì vậy, bạn có thể giúp mọi người chạy xung quanh và làm mọi thứ khó khăn hơn, nhưng trong trường hợp bạn đã làm tất cả những gì bạn có thể làm là cố gắng làm cho nó không đáng để người khác phải đầu tư.

Bảo vệ phần mềm là khó khăn, đặc biệt là trong một cái gì đó như Java có thể dễ dàng được giải mã và không thể thay đổi mã riêng của nó như C/Assembly có thể. Có một lý do khiến một số phần mềm đắt nhất có yêu cầu phần cứng dongle hoặc bị khóa đến một CPU hoặc phần cứng khác.

+0

bây giờ tôi hiểu khi tôi sử dụng Ericsson TEMS lý do tại sao tôi đã phải sử dụng usb dongle tất cả thời gian để chạy nó, đáng ngạc nhiên usb không có dữ liệu trên nó, nhưng nó sẽ không hoạt động mà không có nó – Johnydep

3

Nói chung, không có cách nào để làm điều này một cách an toàn, nếu bạn muốn ứng dụng và dữ liệu của ứng dụng được tự chứa. Tuy nhiên, bạn chắc chắn có thể mã hóa các tệp và giải mã chúng bằng một khóa được chôn trong mã. Một hacker xác định có thể nhận được nó, nhưng nếu đó không phải là những gì bạn đang lo lắng về, sau đó tốt. Nếu bạn làm điều này, hãy nhớ rằng dữ liệu được mã hóa không thể được nén, do đó, nén đầu tiên, sau đó mã hóa.

Nếu bạn thực sự cần dữ liệu để bảo mật (ví dụ: dữ liệu bí mật), bạn cần mã hóa dữ liệu bằng khóa và cung cấp khóa đó cho ứng dụng của tôi một số phương tiện bên ngoài, chẳng hạn như đặt nó lên nhận được điều đó cho người dùng bằng phương tiện chuyển phát nhanh bảo mật.

Một khả năng khác để làm cho dữ liệu (hoặc khóa) khả dụng trên SSL và sử dụng phương pháp xác thực tốt để xác minh người dùng của bạn là ai.

Nói chung - không thể cho bất kỳ hệ thống nào được bảo mật một cách hoàn hảo, nhưng nó cũng không đáng lo ngại. Một hệ thống chỉ cần đủ an toàn để ngăn cản những kẻ tấn công mà bạn nghĩ rằng sẽ cố gắng để crack nó.

9

Tôi đồng ý với Kosi2801. Mã hóa tệp lớp chỉ là bắt chước bảo mật (xem http://www.excelsior-usa.com/articles/java-obfuscators.html) Việc sử dụng Trình nạp lớp tùy chỉnh có thể phá vỡ ứng dụng, ví dụ: trong Máy chủ ứng dụng.

Có cách tốt hơn: sử dụng mã hóa chuỗi hằng số trong một tệp lớp. Hầu hết các obfuscators thương mại có chức năng này, ví dụ Allatori, Stringer Java Obfuscation Toolkit, Zelix KlassMaster, Smokescreen, DashO (siêu đắt). Trình chặn mã vạch Java Stringer có tính năng kiểm tra ngữ cảnh và kiểm soát tính toàn vẹn của cuộc gọi giúp bảo vệ khó thực hiện.

Cách an toàn nhất là lưu trữ và thực thi các bộ phận của bytecode trên thiết bị bên ngoài như JavaCard.

N.B. Tôi là CEO tại Licel LLC. Nhà phát triển của Stringer Java Obfuscator.

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