c# - password - sha256 online
C#SHA-256 contra Java SHA-256. Diferentes resultados? (4)
hexString.append(Integer.toHexString(0xFF & hash[i]));
Está construyendo la cadena hash incorrectamente. Integer.toHexString
no incluye ceros a la izquierda, así que mientras Integer.toHexString(0xFF) == "FF"
, el problema es que Integer.toHexString(0x05) == "5"
.
Corrección sugerida: String.format("%02x", hash[i] & 0xFF)
Quiero convertir un código que está en Java a C #.
Código de Java:
private static final byte[] SALT = "NJui8*&N823bVvy03^4N".getBytes();
public static final String getSHA256Hash(String secret)
{
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(secret.getBytes());
byte[] hash = digest.digest(SALT);
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < hash.length; i++) {
hexString.append(Integer.toHexString(0xFF & hash[i]));
}
return hexString.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
throw new RuntimeException("SHA-256 realization algorithm not found in JDK!");
}
Cuando traté de usar la clase SimpleHash, obtuve hashs diferentes
ACTUALIZAR:
Por ejemplo:
Java: byte [] hash = digest.digest (SALT); genera (primeros 6 bytes):
[0] = 9
[1] = -95
[2] = -68
[3] = 64
[4] = -11
[5] = 53
....
C # code (clase SimpleHash): string hashValue = Convert.ToBase64String (hashWithSaltBytes); hashWithSaltBytes tiene (primeros 6 bytes):
[0] 175 byte
[1] 209 byte
[2] 120 byte
[3] 74 byte
[4] 74 byte
[5] 227 byte
El código de C # al que se vincula también usa sal, pero el código de Java no. Si usa sal con una vez, pero no con la otra, los resultados serán (y deberían ser) diferentes.
Realmente no escribió cómo llamó a la clase SimpleHash, con qué parámetros y tal.
Pero tenga en cuenta que su método ComputeHash
tiene en su documentación:
Valor de hash formateado como una cadena codificada en base64.
En su lugar, la clase formatea la salida en hexadecimal, lo que obviamente será diferente.
Además, la sal está en SimpleHash interpretada como base64, mientras que su método la interpreta como ASCII (o cualquiera que sea la codificación de su sistema, probablemente sea algo compatible con ASCII, y la cadena solo contiene caracteres ASCII).
Además, la salida en SimpleHash incluye la sal (para permitir la reproducción de la parte "verificar" cuando se usa sal aleatoria), lo que no ocurre en su método.
(Más puntos ya son mencionados por las otras respuestas).
El método String.getBytes codifica la cadena en bytes utilizando el juego de caracteres predeterminado de la plataforma, mientras que el código de ejemplo que ha vinculado usa UTF-8.
Prueba esto:
digest.update(secret.getBytes("UTF-8"));
En segundo lugar, el método Integer.toHexString devuelve el resultado hexadecimal sin ningún 0 inicial.