Quan tâm của tôi là các khóa mật mã và bí mật được quản lý bởi bộ thu gom rác có thể được sao chép và di chuyển xung quanh trong bộ nhớ mà không cần số không.Làm cách nào để đảm bảo rằng đối tượng Java (chứa tài liệu mã hóa) được zeroized?
Là một giải pháp khả thi, nó là đủ để:
public class Key {
private char[] key;
// ...
protected void finalize() throws Throwable {
try {
for(int k = 0; k < key.length; k++) {
key[k] = '\0';
}
} catch (Exception e) {
//...
} finally {
super.finalize();
}
}
// ...
}
EDIT: Xin lưu ý rằng vấn đề của tôi là liên quan đến không chỉ zeroization của chính thức (tham chiếu) bản sao của đối tượng, mà còn bất kỳ bản cũ các người thu gom rác có thể đã thực hiện trong khi nó xáo trộn bộ nhớ xung quanh cho không gian và tốc độ hiệu quả.
Ví dụ đơn giản nhất là GC đánh dấu và quét, nơi các đối tượng được đánh dấu là 'tham chiếu' và sau đó tất cả các đối tượng đó được sao chép sang một vùng khác. Phần còn lại là rác và do đó chúng được thu thập. Khi bản sao xảy ra, điều đó có thể để lại dữ liệu khóa còn lại không được quản lý bởi bộ thu gom rác (vì dữ liệu 'chính thức' nằm trong vùng mới).
Kiểm tra litmus cho điều này sẽ là nếu bạn sử dụng khóa trong mô-đun mã hóa, zeroize khóa, sau đó kiểm tra toàn bộ không gian quy trình JVM, bạn nên không phải tìm khóa đó.
Tôi đã xem xét xung quanh, nhưng tôi không tìm thấy cách truy cập dữ liệu GC. Tôi muốn trả lời rằng loại bỏ các tham chiếu giữa các thuộc tính và giá trị của nó, không có cách nào để truy cập nó một lần nữa, nhưng tôi không shure, như bạn đã có nghi ngờ này. – marionmaiden
Về cơ bản không có cách nào (hiện tại) để làm những gì bạn muốn với các đối tượng java chuẩn. – james
Không thực sự chắc chắn điểm là mặc dù. Thông tin nằm trong bộ nhớ _somewhere_.nếu kẻ tấn công có quyền truy cập vào bộ nhớ cục bộ, thì bạn bị kẹt khá nhiều. – james