#java #arrays #sha #sha512 #message-digest
#java #массивы #sha #sha512 #сообщение-дайджест
Вопрос:
Вот как я инициализирую MessageDigest
private static MessageDigest messageDigest;
public static final String SALT_DO_NOT_CHANGE = "somesalt";
static {
try {
messageDigest = MessageDigest.getInstance("SHA-512");
messageDigest.update(SALT_DO_NOT_CHANGE.getBytes());
} catch (NoSuchAlgorithmException e) {
LOGGER.error("error for message digest", e);
throw new RuntimeException("could not initialize message digest");
}
}
И вот как дайджест получить байты для пароля, которые я позже преобразую в строку (проблем нет)
byte[] bytes = messageDigest.digest(password.getBytes(StandardCharsets.UTF_8));
Теперь предположим, что пароль — «Пароль @ 1».
Вот результат в первый раз (извиняюсь за длинный текст ниже)
115,83,48,-2,41,29,-99,71,-54,-53,-26,-67,-118,48,-75,77,13,100,42,70,-72,110,-85,23,-38,119,-110,-15,121,3,-25,114,-68,109,-108,94,-122,65,-62,10,-90,8,-125,114,-118,51,-51,89,127,55,37,83,-126,56,-31,-27,-49,-60,25,74,-80,-110,23,45
И вот выводится второй раз и далее. После этого он остается неизменным.
-62,-50,45,-44,91,-86,16,90,85,53,101,-122,51,12,-82,52,-123,-101,-10,-28,-108,114,120,-96,84,-23,38,-75,78,67,36,-93,-88,-11,79,76,126,-34,-2,109,76,-31,-30,-86,-28,13,-91,-22,-65,-128,108,-47,15,19,95,60,-30,-123,-4,20,-64,21,-1,7
Может кто-нибудь, пожалуйста, помочь мне понять, что здесь происходит?
Комментарии:
1. Когда я запускаю это в своей системе, я получаю один и тот же дайджест каждый раз, когда я его запускаю.
2. Обычно вы не должны повторно использовать a
MessageDigest
. Создавайте его каждый раз заново.
Ответ №1:
static
Блок запускается только один раз, когда класс загружен (или, точнее, инициализирован, но на практике это происходит при загрузке). Таким образом, если у вас есть метод, который выполняет messageDigest.digest(password)
при первом вызове, он вычисляет дайджест байтов somesaltPassword@1
, которые являются вашим первым значением, и оставляет messageDigest
объект сброшенным; любой последующий вызов вычисляет дайджест байтов Password@1
, которые являются вашим вторым значением, и снова оставляет его сброшенным.
Кстати, вся цель и причина использования salt заключается в том, что он меняется, плюс выполнение одного быстрого хэша пароля (даже с использованием соли) небезопасно, если это не пароль с очень высокой энтропией (больше, чем может запомнить человек), но это оффтопик для SO; безопасность поиска.SX и / или криптография.SX, где на них были даны ответы и обсуждались много раз.