String.hashCode
не подходит для хеширования паролей. Вместо этого вам нужен криптографический хеш.
String.hashCode
разработан для очень быстрого вычисления. Его основное использование для ключа в хэш-таблице. Для этого использования случайное столкновение не является проблемой. Криптографические хэши вычисляются медленнее, но по определению никто не знает, как создавать коллизии для хорошей криптографии.
Что еще более важно, учитывая значение password.hashCode()
, можно найти password
(с высокой степенью достоверности, хотя и не с уверенностью, поскольку многие пароли имеют одинаковый хэш). Это не то, что вы когда-либо хотели бы случиться. Криптографические хеши, с другой стороны, спроектированы так, что невозможно найти пароль, зная хеш (математически, никто не знает, как найти пароль из хэша за время их существования).
Криптографические хеши доступны в стандартной библиотеке Java через java.security.MessageDigest .
ДОБАВЛЕНО : Есть еще одно осложнение: плохая идея напрямую хэшировать пароль. Причина в том, что злоумышленник может использовать все вероятные пароли (например, слова в словарях, имена людей и т. Д.). Стандартное решение этой проблемы - объединить пароль со строкой random , называемой * 1020. * salt перед вычислением хэша: вы делаете что-то вроде sha.digest((salt+password).getBytes())
. Соль делает нецелесообразным для злоумышленника предварительное вычисление всех хэшей вероятных паролей.
Обычно соль генерируется случайным образом, когда пользователь выбирает свой пароль, и она хранится рядом с хэшем пароля в пользовательской базе данных, но из того, что вы показываете в своей схеме, такого нет. Учитывая ваш дизайн, было бы разумно использовать имя файла в качестве соли: fileName.concat(encrypt(fileName + password))
.