it-swarm-vi.com

Xóa a Java Đối tượng an toàn

Tôi biết rằng để xóa một đối tượng Java, tôi nên sử dụng mảng ký tự thay vì Chuỗi, vì tôi có thể xóa (viết lại mảng ký tự với dữ liệu khác) một cách an toàn. khả thi cho các đối tượng String.

Bây giờ trên BlackBerry có Java, tôi không thể tìm thấy API để xử lý dữ liệu dưới dạng mảng ký tự nhưng tôi bắt buộc phải sử dụng Chuỗi. Vì vậy, trong trường hợp tôi lưu trữ mật khẩu một đối tượng, làm thế nào tôi có thể xóa nó một cách an toàn?

33
smiley

Trên thực tế, bạn không thể thực sự "xóa an toàn" một mảng các ký tự trong Java. Java thực hiện cấp phát bộ nhớ thông qua bộ thu gom rác , một phần mềm phức tạp, trong thực tế, sẽ di chuyển các đối tượng bộ nhớ trong vật lý RAM = một cách thường xuyên. Vì vậy, những gì bạn nghĩ là "a char[] dụ "sẽ được sao chép ở một số nơi và việc xóa sẽ chỉ xảy ra ở một trong những nơi đó.

Trong bối cảnh đó, "xóa an toàn" thực sự không thể tồn tại trong Java. Nếu bạn sử dụng Java, bạn phải đảm bảo rằng bối cảnh sử dụng sao cho việc xóa an toàn là không cần thiết: "xóa an toàn" là cần thiết khi hệ điều hành có thể phân bổ các khối khác không RAM (do đó là một ứng dụng có thể nhận được các trích đoạn cũ RAM từ các ứng dụng khác) hoặc khi có bộ nhớ ảo (các phần của RAM được sao chép vào đĩa cứng). I đoán rằng những điều này không áp dụng cho BlackBerry, vì vậy các trường hợp String đơn giản nên ổn.

Một cách khác để nói rằng nếu String dụ không tốt cho mật khẩu, thì bạn có vấn đề bảo mật lớn hơn so với rò rỉ mật khẩu đơn thuần . Rốt cuộc, bạn sử dụng mật khẩu để bảo vệ quyền truy cập vào một số dữ liệu, vì vậy nếu bạn cần "xóa an toàn" cho mật khẩu, thì, theo logic, bạn cũng sẽ cần "xóa an toàn" cho dữ liệu được bảo vệ và mọi thứ bạn làm với nó.

(Người ta có thể đoán rằng tôi không phải là một fan hâm mộ lớn của khái niệm "xóa an toàn".)

43
Thomas Pornin

trong trường hợp tôi lưu mật khẩu trong một đối tượng, làm thế nào tôi có thể xóa nó một cách an toàn?

Tôi nghĩ bạn muốn nói; Làm thế nào bạn có thể ngăn kẻ tấn công có quyền truy cập vào thiết bị để khôi phục mật khẩu?

Nó phụ thuộc vào mức độ truy cập mà kẻ tấn công đã đạt được.

Nếu kẻ tấn công bị giới hạn trong API bên ngoài mà bạn cung cấp (không phải là giả định tốt), thì kiểm soát truy cập bằng Java.security.AccessControll sẽ đủ. Nếu bạn thiết kế các điều khiển truy cập của mình một cách chính xác (rất khó thực hiện) và kẻ tấn công không thể bỏ qua các điều khiển truy cập, thì kiểm soát truy cập sẽ ngăn kẻ tấn công lấy dữ liệu.

Nếu kẻ tấn công bị giới hạn hoạt động trong Java máy ảo nhưng không phải API của bạn, thì bạn cần bảo vệ dữ liệu bằng KeyStore.PrivateKeyEntry. Ở cấp độ này, bạn không thể dựa vào hoạt động đúng của thiết kế của bạn để bảo vệ dữ liệu và bạn phải dựa vào Java máy ảo để cung cấp bảo vệ.

Nếu kẻ tấn công bị giới hạn trong hệ điều hành (không phải Java) thì bạn không thể bảo vệ dữ liệu của mình. Nếu kẻ tấn công có thể ngăn chặn Java Virtual Máy hoạt động như thiết kế, sau đó kẻ tấn công có thể bỏ qua mọi cơ chế bảo mật Java.

Nếu kẻ tấn công có quyền truy cập vật lý vào thiết bị thì không thể bảo vệ dữ liệu trước mọi cuộc tấn công. Ở cấp độ này, kẻ tấn công có thể đọc dữ liệu khi nó được ghi vào RAM, flash, mô-đun phần cứng, v.v.

6
this.josh