Это вопрос для мозгового штурма о том, что возможно в Java (или нет). Я хочу знать, можно ли скрыть секрет внутри класса и предотвратить доступ к нему только с использованием кода Java или любой его функции (безопасность, отражение, сериализация, загрузчики классов, имя-имя- это ...).
Вот что я пока имел в виду:
public final class Safe {
private String secret;
private HashMap validCertificates
= new HashMap();
public Safe(String aSecret) {
this.secret = aSecret;
}
public final class Credentials {
private String user;
private Credentials(String user) {
this.user = user;
}
}
public final Credentials getCredential(String user) {
// Following test is just for illustrating the intention...
if ( "accepted".equals(user) ) {
return new Credentials(user);
} else {
return null;
}
}
public String gimmeTheSecret(Credentials cred) {
if ( this.validCertificates.get(cred.user) == cred ) {
return secret;
} else {
return null;
}
}
private void writeObject(ObjectOutputStream stream) throws IOException {
throw new RuntimeException("No no no no no no no!!!");
}
}
Можно ли это улучшить? Следует ли его улучшить? Невозможно ли реализовать идею блокировки секрета в безопасном классе?
РЕДАКТИРОВАТЬ
Актуальность:
Некоторые люди сомневаются в актуальности проблемы, которую я здесь поднимаю. Хотя я задаю общий вопрос, чтобы вызвать открытый диалог, для этого класса есть очень конкретное приложение:
Пояснение:
Факты:
Решенные проблемы:
Что касается среды выполнения, нам нужно различать два случая:
Если мы настроим соответствующий SecurityManager, отключающий отражение и ограничивающий разрешения для любого загруженного ненадежного кода, тогда наш секрет в безопасности.
Хакер может создать собственное приложение со своим собственным менеджером безопасности и загрузчиком Secure Class. Он может загрузить наш код из пути к классам и выполнить его, как если бы это было наше собственное приложение. В этом случае он может взломать сейф.