sql >> Base de Datos >  >> RDS >> Sqlserver

El hash SHA1 de membresía no es el mismo para todos los usuarios

Hm... Creo que algo puede estar saliendo mal cuando los dos valores están concatenados. El hashing realmente debería usar una matriz de bytes, como con la versión cifrada , pero desafortunadamente el hash() de CF9 la función no lo admite, solo cadenas. (Aunque mal documentado, es compatible con CF11). No estoy seguro de si existe una solución alternativa CF pura para CF9. Sin embargo, mientras tanto, podría usar Java directamente:

<cfscript>
    thePassword = "[email protected]";
    base64Salt = "+muo6gAmjvvyy5doTdjyaA==";

    // extract bytes of the salt and password
    saltBytes = binaryDecode(base64Salt, "base64");
    passBytes = charsetDecode(thePassword, "UTF-16LE" );

    // next combine the bytes. note, the returned arrays are immutable, 
    // so we cannot use the standard CF tricks to merge them    
    ArrayUtils = createObject("java", "org.apache.commons.lang.ArrayUtils");
    dataBytes = ArrayUtils.addAll( saltBytes, passBytes );

    // hash binary using java
    MessageDigest = createObject("java", "java.security.MessageDigest").getInstance("SHA-1");
    MessageDigest.update(dataBytes);    
    theBase64Hash = binaryEncode(MessageDigest.digest(), "base64");

    WriteOutput("<br />theBase64Hash= "& theBase64Hash &"<br/>");
    WriteOutput("DBPassword= nfcqQBgeAm0Dp1oGZI0O70Y6DvA= <br />");
</cfscript>

Actualización:

Después de mirar más a fondo, no creo que haya una solución CF pura. La codificación UTF-16LE es solo una parte del problema. El otro problema es que DNN decodifica cada cadena por separado , que puede producir bytes diferentes que cuando ambos se decodifican como un único cadena (ver comparación a continuación). Lo hace en el caso de su segunda contraseña, por lo que el hash final es diferente. Desde hash no aceptará matrices de bytes, no creo que sea la herramienta adecuada para este trabajo. MessageDigest es el camino a seguir.

Comparación de matrices de bytes

           old|   new | 
   1 |     -6 |    -6 | 
   2 |    107 |   107 | 
   3 |    -88 |   -88 | 
   4 |    -22 |   -22 | 
   5 |      0 |     0 | 
   6 |     38 |    38 | 
   7 |   -114 |  -114 | 
   8 |     -5 |    -5 | 
   9 |    -14 |   -14 | 
  10 |    -53 |   -53 | 
  11 |   -105 |  -105 | 
  12 |    104 |   104 | 
  13 |     -3 |    77 | **
  14 |     -1 |   -40 | **
  15 |     68 |   -14 | **
  16 |      0 |   104 | **
  17 |     84 |    68 | **
  18 |      0 |     0 | 
  19 |     33 |    84 | **
  20 |      0 |     0 | 
  21 |     64 |    33 | **
  22 |      0 |     0 | 
  23 |     49 |    64 | **
  24 |      0 |     0 | 
  25 |     50 |    49 | **
  26 |      0 |     0 | 
  27 |        |    50 | **
  28 |        |     0 | **
  • antiguo => charsetDecode(la Sal y la Contraseña, "UTF-16LE")
  • nuevo => ArrayUtils.addAll( saltBytes, passBytes );