Shiro varias veces en SimpleHash hash MD5

Apache Shiro es un potente y fácil de usar marco de seguridad de Java para la implementación de la autenticación, autorización, contraseña y gestión de sesiones, y se puede integrar fácilmente por el arranque de la primavera.
La mayoría contraseña de usuario de aplicaciones Web es generalmente a través de una forma de sal + algoritmo de hash de la persistencia en la base de datos. Cuando se utiliza para la autenticación Shiro, puede configurar los hashes de contraseñas coinciden en configuración de clase Shiro, para verificar la contraseña almacenada en la base de datos. El siguiente es un ejemplo de configuración de un igualador de hash criptográfica en Shiro en:

@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher() {
  HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
  hashedCredentialsMatcher.setHashAlgorithmName("md5"); // 设置 MD5 散列算法
  hashedCredentialsMatcher.setHashIterations(2); // 散列迭代次数
  hashedCredentialsMatcher.setStoredCredentialsHexEncoded(true);
  return hashedCredentialsMatcher;
}复制代码

Aprendí hace dos días, cuando de Shiro, vio una parte considerable del curso de chino, todo lo que es equivalente a dos veces el hash md5(md5("")), encontré fácilmente un par de artículos realizados este punto de vista:

De hecho, estos tutoriales están cargadas, hace picadillo no significa el doble md5(md5("")). Simplemente podemos probar.

Con "hola" como un ejemplo, la prueba dos veces MD5 resultado control

De acuerdo con hash de dos veces el equivalente a md5(md5(""))decir, por "hola" de hash MD5 de cadena doble, los resultados de operación del programa son los siguientes (pseudo código):

String hash = "hello";
Integer iteration = 2;
for (int i = 0; i < iteration; i++) {
  hash = md5(hash)
}
// 第一次 MD5 结果:5d41402abc4b2a76b9719d911017c592
// 第二次 MD5 结果:69a329523ce1ec88bf63061863d9cb14复制代码

Hash MD5 realizó dos veces paquete integrado Shiro SimpleHash, el resultado es diferente:

String hash = "hello";
String salt = null;
Integer iteration = 2;
SimpleHash simpleHash = new SimpleHash("MD5", hash, salt, iteration);
simpleHash.getHash();
// 迭代两次的 MD5 散列结果:62109206880d38a4010a98e11243924a复制代码

Shiro SimpleHash visto en varios conjuntos del hash MD5 no es igual a una capa md5().
Debe ser simple mención del proceso de hash MD5.

MD5 principio algoritmo de hash

MD5 algoritmo puede ser visto como una "función", cadena binaria arbitraria puede ser utilizado como una variable de entrada a esta "función", después de hashing cadena binaria (grandes números enteros)-128 fijo, a continuación, después de esta gran hexadecimal número entero conversión, el valor MD5 obtiene finalmente 32 caracteres.

proceso Hashing sustancialmente como sigue:

  1. suplemento de bits
  2. Los bits de promedio en 16 grupos, cada grupo de 32 bits, cuatro de inicialización constante (por defecto número mágico estándar) el funcionamiento de cuatro tiempos, cada ronda del resultado del cálculo se actualizan secuencialmente a las constantes
  3. Después de que se completó todo el procesamiento, las cuatro constantes de acuerdo con la memoria baja a la disposición de memoria alta, un total de 128
  4. La conversión resultado hex, para dar un valor final MD5

Por SimpleHash palanca fuente del proceso repetidamente hash

private void hash(ByteSource source, ByteSource salt, int hashIterations) throws CodecException, UnknownAlgorithmException {
  byte[] saltBytes = salt != null ? salt.getBytes() : null;
  byte[] hashedBytes = this.hash(source.getBytes(),
                      saltBytes, hashIterations); // 进行散列
  this.setBytes(hashedBytes);
}

protected byte[] hash(byte[] bytes, byte[] salt, int hashIterations) throws UnknownAlgorithmException {
  MessageDigest digest = this.getDigest(this.getAlgorithmName());
  if (salt != null) {
    digest.reset();
    digest.update(salt);
  }
  byte[] hashed = digest.digest(bytes);
  int iterations = hashIterations - 1;

  for(int i = 0; i < iterations; ++i) { // 根据迭代次数进行多次散列
    digest.reset();
    hashed = digest.digest(hashed);
  }
  return hashed;
}复制代码

Todo parecía muy claro el origen, SimpleHash cada uno de hash será de 128 cadena binaria, hash muchas veces obtendrán cadena binaria como entrada para re-hash, en lugar de valor MD5 de la conversión hexadecimal re-hash.

conclusión

Así, el doble hash MD5 Shiro SimpleHash no es igual md5(md5("")). La diferencia entre ellos es que el primero dará secundaria cadena binaria de hash, después de lo cual el cálculo MD5 (hash y el resultado de la conversión hex hash) obtenido por hashing los segundos caracteres de 32 bits.


Supongo que te gusta

Origin juejin.im/post/5e800267518825738c362792
Recomendado
Clasificación