В Java старый способ хранения секретности, такой как пароль, состоял в том, чтобы использовать char[]
, поскольку вы могли бы перезаписать свои данные, когда закончите с ним. Однако с тех пор было показано, что это небезопасно, поскольку сборщик мусора будет копировать вещи, когда он реорганизует кучу. На некоторых архитектурах возможно, что страница будет освобождена, и секрет останется, когда какая-то другая программа выделяет эту же страницу.
Это ужасно уродливо, но что, если секрет хранится в стеке метода Thread run
? Необходимо позаботиться о том, чтобы прекратить поток изящно, чтобы он мог обнулить свои данные, но эта проблема присутствовала и по-старому.
Одна из основных проблем, которые я сразу вижу, заключается в том, что я не могу думать о безопасном способе получения данных в контейнере и из него. Вы можете свести к минимуму вероятность просочившейся секретности, используя потоки с очень маленькими внутренними буферами, но в итоге вы столкнулись с той же проблемой, что и char[]
. [Изменить: будет ли один член private static byte
и флаг работать? Хотя это ограничит вас одним секретом для ClassLoader. Это добавляет больше уродства, но было бы легко спрятаться за хорошо написанным интерфейсом.]
Итак, у меня есть куча вопросов, действительно.
Является ли стек более безопасным от этих типов атак, чем куча? Существуют ли какие-либо чистые Java-механизмы для выполнения стека-стека между двумя различными стековыми кадрами таким образом, который был бы полезен для этой проблемы? Если нет, сможет ли JVM поддерживать этот тип операций в байт-коде?
[Edit: Прежде чем люди слишком много переживут, это скорее эксперимент с мыслями, чем что-либо еще. У меня нет абсолютно никакого намерения "тестировать на производстве" или использовать его в любом текущем проекте. Я понимаю, что то, о чем я говорю, действительно уродливое, вероятно, ужасно громоздкое и работает против всей структуры JVM. Меня просто интересует, возможно ли это, действительно ли это выполняет мои цели и какие героики он будет делать, чтобы это произошло.]