В аналоговых точно нет, в цифровых зависит от реализации, если чайник с наворотами, аля поддерживать температуру или отключать при заданой температуре, то могут сделать и цифровое отключение, опять же могут добавить предохранитель, а могут сэкономить и не добавить. Но если верить законам Мерфи, если где то можно накосячить, то обязательно накосячат, даже там где вы думали что нельзя.
А можно и забыть затереть. И в стринге можно, только чуток с рефлекшеном поиграть, так в чём существенное отличие? При условии что у злоумышлиника есть доступ к рабочей jvm (память, debug режим, внедрил свой код), только в том что пароль будет там храниться более короткое время ? Но если я вклинился в код или в дебаг режиме то как бы до затирания можно и не дойти.
Если я звлоред имею доступ к серверу с приложением с правами запуска перезапуска приложения, то вы можете хранить хоть в стринге, хоть в масиве байтов, хоть в масиве char, если будет хоть одно мгновение когда пароль будет в открытом виде, я его выужу, затираете вы его или нет. Тут или предполагаем что зловред доступа к серваку не получит, или не храними не передаём пароли в открытом виде.
Повзламывать внутреннюю сеть, понаставить вирусов и тд и тп. Это конечно неприятно, но гораздо больше смущает то что при помощи таких девайсов можно будет, наделать бед в реальном мире. Например кипятить чайник до выкипания воды и дальше, пока пластик не загорится, забирать воду из системы при помощи посудомойки или стиралки пока всех соседей не затопишь, вот это веселуха.
А в чём существенная разница между хранением паролей в String и char[] или даже byte[] ? Если есть доступ к оперативной памяти, то это как бы вопрос техники как его оттуда выковырять, ну и если посмотрите сорцы String (java) то значение храниться в
private final char value[];
Как бы разницы не вижу акромя что у String можно дёрнуть intern() и тем самым стрельнуть себе в ногу
Пароль желательно не хранить вообще, а хранить его хеш и тот с солью, которую надо добавлять в начало пароля.
Хорошо или плохо это понятия относительные, и зависят от наблюдателя.
Но можно, хотя не стандартным способом, а при помощи reflection, при большом желании можно и весь класс подменить.
Field value = String.class.getDeclaredField("value");
value.setAccessible(true);
Field hash = String.class.getDeclaredField("hash");
hash.setAccessible(true);
String s = new String("test");
char[] charArr = (char[]) value.get(s);3-4 по списку из тех что я знаю. Но знаю что java позволяет всё что мне нужно было :-) На этот язык/платформу я матерюсь меньше всего, чего не скажешь о JS и C#
charArr[1] = ’o’;
hash.set(s, 0);//для соблюдения контракта, чтоб hashCode пересчитался
System.out.println(s); //tost
А вот как в C# одновременно итерировать по Dictionary и удалять с него элементы, я не нашёл, возможно как то можно нестандартно, но стандартно вроде нельзя.
P.S. Насчёт C# не судите строго, это не мой native language :-) а где то