Конечно, это не остановит знающего и решительного злоумышленника - посмотрите другие ответы. В этом случае кто-то может просто заменить ваш открытый ключ своим собственным, esp. если вы не подтвердите цепочку сертификатов. Но если вы можете использовать подписи вместо шифрования, это избавит вас от головной боли.

опрос мозгового штурма о том, что возможно в Java (или нет). Я хочу знать, возможно ли спрятать секрет в классе и больше не иметь к нему доступаиспользуя код Java или любую его функцию только (безопасность, рефлексия, сериализация, загрузчики классов, вы-имя-это ...).

Вот что я имею в виду:

public final class Safe {

    private String secret;
    private HashMap<String, Credentials> validCertificates
            = new HashMap<String, Credentials>();

    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!!!");
    }

}

Можно ли это улучшить? Должно ли это быть улучшено? Нельзя ли реализовать идею блокировки секрета в безопасном классе?

РЕДАКТИРОВАТЬ

Актуальность:

Некоторые люди ставят под сомнение актуальность вопроса, который я поднимаю здесь. Хотя я задаю общий вопрос, чтобы вызвать открытый разговор, для этого класса есть очень конкретное приложение:

Если я хочу расшифровать некоторые сообщения, мне нужно загрузить данные закрытого ключа в класс. Если я не могу предотвратить доступ к нему другого Java-кода, невозможно создать безопасную систему. Конечно, если я хочу расшифровать сообщение, мне лучше сделать это в классе, чем выдавать секрет, но все же сейф должен оставаться неразрушимым.

Разъяснение:

Экземпляры класса создаются только во время выполнения, а не во время компиляцииКод может выполняться в приложениях веб-сервера или любых приложениях для настольных компьютеров или устройствКласс используется только для хранения секрета во время выполнения, в памяти, нет планов его сохранения (для сохранения можно / нужно использовать классические методы шифрования)

Факты:

Чтобы реализовать безопасность в приложении Java, необходимо установить экземпляр SecurityManager, гдепроверка методы переопределяются по мере необходимостиЭто приложение может загружать ненадежный код с помощью безопасных загрузчиков классов и назначать домен защиты для классов, которые оно загружает. Этот доменне следует включает RuntimePermission ("setSecurityManager").Ненадежный код может попытаться изменить SecurityManager, но поскольку загрузчик защищенных классов не предоставил разрешения setSecurityManager, будет выдано исключение SecurityException.

Решенные проблемы:

Что касается среды выполнения, нам нужно выделить два случая:

Контролируемая среда: Мы запускаем приложение, которое будет использовать ненадежный код, пытаясь взломать наш «сейф».

Если мы установим правильный SecurityManager, отключив отражение и ограничив разрешения для любого загруженного ненадежного кода, тогда наш секрет в безопасности.

Неконтролируемая среда: Хакер может запустить приложение, которое использует ненадежный код, пытаясь взломать наш «сейф».

Хакер может создать свое собственное приложение с собственным менеджером безопасности и загрузчиком Secure Class. Он может загрузить наш код из пути к классам и выполнить его, как если бы это было наше собственное приложение. В этом случае он может сломать сейф.

Как установлено вотдельный вопрос, sun.misc.Unsafe не может сломать менеджер безопасности

Ответы на вопрос(12)

Ваш ответ на вопрос