Народные явайские песни

Jul 03, 2013 10:50

Объясните мне, почему System.console().readLine() возвращает String, а readPassword() -- char[]?

java, программирование

Leave a comment

Comments 22

raydac July 3 2013, 07:13:14 UTC
вполне может быть что как раз пытались сделать так что бы readPassword было бы гарантированно не перепутать с readLine

Reply

tobotras July 3 2013, 08:51:00 UTC
Нет, см. комментарии ниже.

Reply

raydac July 3 2013, 08:55:44 UTC
там имхо какая то лажа, "массив на стеке" в Java это жесть.. на стеке будет лежать указатель на массив в хипе и этот объект в хипе, разве что действительно что бы меньше было возможностей для хака, а может быть этот метод реализован явой как интринсик, но чем легковеснее конечно тем быстре сотрется

Reply

ktotam July 3 2013, 15:06:25 UTC
речь о том, что массив, в отличие от строки, можно вручную затереть нолями, когда он больше не нужен.

Reply


alxt July 3 2013, 07:16:04 UTC
Потому что char[] будет на стеке и быстро затрётся данными. А String может прожить в памяти, до сборки мусора, неопределённое время.
А вдруг там какая-нибудь хакерская приблуда? Вот для уменьшение времени жизни пароля его в char[] и хранят везде.

PS: может и паранойя авторов.

PPS: я в клиенте jboss7 без хранения пароля в String не обойтись никак...

Reply

tobotras July 3 2013, 07:28:42 UTC
Ну, он точно будет в куче, а не на стеке. Но точно -- чтобы стереть побыстрее, однозначно. Спасибо.

Reply

alxt July 3 2013, 07:35:26 UTC
> Ну, он точно будет в куче, а не на стеке.

Если переменная локальная- то на стеке.
Если переменная класса- то да, в куче. Но типа сам виноват, если что :)

Reply

tobotras July 3 2013, 07:54:57 UTC
Как из функции вернуть массив, лежащий на стеке?

Reply


ktotam July 3 2013, 07:26:48 UTC
потому что String -- immutable, а массив можно затереть, когда он больше не нужен.

Reply

tobotras July 3 2013, 07:27:57 UTC
А! Точно. Спасибо.

Reply

ktotam July 3 2013, 07:35:56 UTC
javadoc как всегда все честно говорит

Security note: If an application needs to read a password or other secure data, it should use readPassword() or readPassword(String, Object...) and manually zero the returned character array after processing to minimize the lifetime of sensitive data in memory.

Reply

tobotras July 3 2013, 07:58:42 UTC
Да-да, я забыл, что String -- immutable, остальное понятно.

Reply


Leave a comment

Up