Как рассчитать SHA-256 Tomcat 8 совместимый с DataSourceRealm хэш в коде Java?

Я использую Tomcat 8.0.17 с JDK 1.8.0_25. Я использую Дерби для базы данных.

У меня есть DataSourceRealm, работающий с аутентификацией FORM с использованием дайджестов SHA-256.

Мой $WEBAPP/META-INF/context.xml выглядит так:

<Context> 
  <ResourceLink global="jdbc/demo" name="jdbc/demo" type="javax.sql.DataSource" />
  <Realm className="org.apache.catalina.realm.DataSourceRealm"
         digest="SHA-256"
         dataSourceName="jdbc/demo"
         userTable="users" userNameCol="user_name" userCredCol="user_pass"
         userRoleTable="user_roles" roleNameCol="role_name"/>
</Context> 

При использовании инструмента дайджеста, который поставляется с Tomcat, я могу вручную обновить столбец users.user_pass в базе данных с помощью вывода инструмента дайджеста, и все работает (примечание -s 0, поскольку Tomcat не работает с солеными хэшами):

C:\>"%CATALINA_HOME%\bin\digest" -a SHA-256 -s 0 hotdog
hotdog:$1$35602208e86ac7d6b3a63780a9538a9d1763a646d5b9f3930a0548e0983e0ca6

...

ij> update users set user_pass='$1$35602208e86ac7d6b3a63780a9538a9d1763a646d5b9f3930a0548e0983e0ca6' where user_name='demouser';
1 row inserted/updated/deleted

Теперь я могу успешно войти в систему.

Как теперь программно (на Java) генерировать хешированные пароли SHA-256 для вставки в базу данных? Я видел много примеров генерации хэшей SHA-256 и преобразования байтовой строки в шестнадцатеричное. Но часть, которая отбрасывает меня, - это начало хэша при использовании дайджеста. В начале он всегда генерирует хэши с символом $. При программном преобразовании хэша и кодировании в шестнадцатеричный формат в выводе никогда не будет символов "$" (поскольку в шестнадцатеричном формате нет символа "$", только 0-F). Но Tomcat, похоже, прекрасно работает с выводом дайджест-инструмента (который включает в себя знаки доллара).

3 ответа

Результат метантенка выходит в формате:

Пароль: соль $ Итерации $ переваривать

Например, пароль "1234", 20 символов соли и 10 итераций приведут к следующему:

1234: d83beb29c66cd2f021a469875ffd4c608c25d855 $ 10 $ eab99fbeedfd7d01b94cd3cf8484a99ad671726faa3e5d48c0699b489aa35658

Я только что проверил это, и я предполагаю, что Tomcat просто удаляет все до второго знака доллара из выходных данных дайджест-инструмента. Поэтому я могу сгенерировать хеш-строку SHA-256 в Java, используя Apache Commons:

String sha256hex = org.apache.commons.codec.digest.DigestUtils.sha256Hex(password);  

РЕДАКТИРОВАТЬ: так каково значение знаков '$' в строке хеша, которую генерирует инструмент дайджеста? Я собираюсь догадаться, что это связано с солью?


пакет testapp;

import java.security.NoSuchAlgorithmException; import javax.xml.bind.DatatypeConverter; /** * * @author Martin */ public class TestApp { /** * @param args the command line arguments */ public static void main(String[] args) { /* testing how to salted sha-256 like tomcat digest.sh -> credential:salt$iterations$hash /usr/local/apache-tomcat-8.0.26/bin/digest.sh -a SHA-256 NonGuesablePassword NonGuesablePassword:a2eda424107c276748780bca8e7d46256321345e1fd0d0d0bcdbcee72dcc0a4a$1$8f2027b86b0b475be7d09c737995037864a4dbc44d90f24648680169b246a9c7 */ String pwd="NonGuesablePassword"; String salt="a2eda424107c276748780bca8e7d46256321345e1fd0d0d0bcdbcee72dcc0a4a"; String hash="8f2027b86b0b475be7d09c737995037864a4dbc44d90f24648680169b246a9c7"; try { System.out.println(hash+" 1st iteration hash"); java.security.MessageDigest md = java.security.MessageDigest.getInstance("SHA-256"); md.update(DatatypeConverter.parseHexBinary(salt)); md.update(pwd.getBytes()); System.out.println(DatatypeConverter.printHexBinary(md.digest())+ " 1st iteration") ; // encrypte sha-256 versie System.out.println(DatatypeConverter.printHexBinary(md.digest())+ " 2nd iteration") ; // encrypte sha-256 versie } catch (NoSuchAlgorithmException na) { System.out.println(na.getMessage()); } } }

также: tomcat распознает 2 знака $ в поле userCredCol при использовании дайджеста. Без $ он использует несоленную версию, и это равняется размеру соли 0 с 1 итерацией, например, "$1$hash" или "hash" идентичны.

ТАКЖЕ: не все коты имеют одинаковую дайджест-версию. В отличие от 8.0.26, 8.0.14 не имеет возможности для ша-256 с солью. размещение соленой информации в userCredCol, очевидно, не сработает.

Другие вопросы по тегам