Подтвердить что ты не робот

Можно ли хранить секреты в стеке в java?

В Java старый способ хранения секретности, такой как пароль, состоял в том, чтобы использовать char[], поскольку вы могли бы перезаписать свои данные, когда закончите с ним. Однако с тех пор было показано, что это небезопасно, поскольку сборщик мусора будет копировать вещи, когда он реорганизует кучу. На некоторых архитектурах возможно, что страница будет освобождена, и секрет останется, когда какая-то другая программа выделяет эту же страницу.

Это ужасно уродливо, но что, если секрет хранится в стеке метода Thread run? Необходимо позаботиться о том, чтобы прекратить поток изящно, чтобы он мог обнулить свои данные, но эта проблема присутствовала и по-старому.

Одна из основных проблем, которые я сразу вижу, заключается в том, что я не могу думать о безопасном способе получения данных в контейнере и из него. Вы можете свести к минимуму вероятность просочившейся секретности, используя потоки с очень маленькими внутренними буферами, но в итоге вы столкнулись с той же проблемой, что и char[]. [Изменить: будет ли один член private static byte и флаг работать? Хотя это ограничит вас одним секретом для ClassLoader. Это добавляет больше уродства, но было бы легко спрятаться за хорошо написанным интерфейсом.]

Итак, у меня есть куча вопросов, действительно.

Является ли стек более безопасным от этих типов атак, чем куча? Существуют ли какие-либо чистые Java-механизмы для выполнения стека-стека между двумя различными стековыми кадрами таким образом, который был бы полезен для этой проблемы? Если нет, сможет ли JVM поддерживать этот тип операций в байт-коде?

[Edit: Прежде чем люди слишком много переживут, это скорее эксперимент с мыслями, чем что-либо еще. У меня нет абсолютно никакого намерения "тестировать на производстве" или использовать его в любом текущем проекте. Я понимаю, что то, о чем я говорю, действительно уродливое, вероятно, ужасно громоздкое и работает против всей структуры JVM. Меня просто интересует, возможно ли это, действительно ли это выполняет мои цели и какие героики он будет делать, чтобы это произошло.]

4b9b3361

Ответ 1

Я бы использовал прямой ByteBuffer. Используемая память не копируется и находится только в одном месте для жизни ByteBuffer. BTW не использует clear(), так как это просто сбрасывает позицию. Вы можете перезаписать его с помощью

bb.clear();
while(bb.remaining() >= 8) bb.putLong(0);
while(bb.remaining() > 0) bb.put((byte) 0);

Является ли стек более безопасным от этих типов атак, чем куча?

Я бы так не подумал.

Существуют ли какие-либо чистые Java-механизмы для выполнения стека-стека между двумя разными кадрами стека, что было бы полезно для этой проблемы?

Вы можете сохранить секрет как один или два long s.

Если нет, сможет ли JVM поддерживать этот тип операций в байте-коде?

Байт-код предназначен для поддержки Java и делает очень мало того, что вы можете сделать на Java.

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

Используйте прямой ByteBuffer, как я предложил.;)