¿Por qué la salida del algoritmo MacTripleDes en PowerShell no es estable?

14

Estoy revisando los hashes del archivo usando varios algoritmos diferentes en powershell. Cuando uso MacTripleDes, siempre obtengo diferentes hashes. Todos los demás, como SHA256 o MD5 siempre dan respuestas confiables. Es posible que pueda replicar el problema en su propia computadora:

"this is a test" | out-file test.txt
get-filehash test.txt -algorithm sha256
get-filehash test.txt -algorithm sha256
get-filehash test.txt -algorithm mactripledes
get-filehash test.txt -algorithm mactripledes

Obtengo los mismos valores hash para los dos primeros hashes, pero valores diferentes para los dos segundos hashes. ¿Se supone que MacTripleDes se usa de manera diferente?

Algorithm       Hash                                                                   Path                                                                                                                      
---------       ----                                                                   ----                                                                                                                      
SHA256          3F8CB2CDF03347329CAB0C80A6CE3B01EF3B17AF02E0F6E101FA67CE63729F51       C:\temp\test.txt                                                                                                          
SHA256          3F8CB2CDF03347329CAB0C80A6CE3B01EF3B17AF02E0F6E101FA67CE63729F51       C:\temp\test.txt                                                                                                          
MACTRIPLEDES    904D74A529C7A739                                                       C:\temp\test.txt                                                                                                          
MACTRIPLEDES    AF720778A2C878A2                                                       C:\temp\test.txt   
usuario6722022
fuente
3
MACTripleDES es un algoritmo de hash con clave . El Get-FileHashcmdlet no parece admitir un parámetro clave.
jscott
Eso suena como un error. Entonces este comentario parece ser la mejor respuesta. Pero no veo cómo marcarlo como tal.
user6722022

Respuestas:

18

MACTripleDES es diferente de los otros algoritmos que ofrece el Get-FileHashcmdlet. No estoy seguro de por qué se incluyó en el cmdlet, para ser honesto. No encaja con los demás, en mi opinión.

SHA1, SHA256, MD5, RIPEMD, etc., esas son todas funciones hash regulares. Toman algunos datos de longitud arbitraria y crean un resumen de longitud fija que representa esos datos. Sin embargo, MACTripleDES es diferente, ya que no es solo un algoritmo hash. Tiene TripleDES en el nombre y 3DES es un algoritmo de cifrado, no un algoritmo de hash. La mayor diferencia entre las funciones hash y las funciones de cifrado es que el cifrado se puede revertir con una clave. Los hashes son funciones unidireccionales.

Y MAC significa código de autenticación de mensaje. Es un código que se usa para autenticar un mensaje. Para verificar que no haya sido alterado. Los MAC están diseñados para ser efímeros o únicos de un mensaje a otro.

Revisa al constructor :

 public MACTripleDES() {
        KeyValue = new byte[24]; 
        Utils.StaticRandomNumberGenerator.GetBytes(KeyValue);

        // Create a TripleDES encryptor 
        des = TripleDES.Create();
        HashSizeValue = des.BlockSize; 

        m_bytesPerBlock = des.BlockSize/m_bitsPerByte;
        // By definition, MAC-CBC-3DES takes an IV=0.  C# zero-inits arrays,
        // so all we have to do here is define it. 
        des.IV = new byte[m_bytesPerBlock];
        des.Padding = PaddingMode.Zeros; 
        ...

StaticRandomNumberGenerator genera números aleatorios ... números aleatorios significa que el resultado será diferente en cada ejecución.

Ryan Ries
fuente
Sí, es bastante inútil aquí. En un uso adecuado, pasaría una clave conocida al constructor o recuperaría la clave aleatoria del KeyedHashAlgorithmobjeto. Pero tampoco hay forma de hacerlo con Get-FileHash...
Bob
1
Si Get-FileHashno le permite especificar la clave a usar y en su lugar genera una clave aleatoria que nunca expone al usuario, eso parece ser un error (según el título original de la pregunta) ya que no puede usar para cualquier cosa (No es que entienda por qué elegirías MACTripleDES en primer lugar si quisieras un MAC.)
Håkan Lindqvist
@ HåkanLindqvist Entiendo tu punto, pero depende de tu definición de error. Si el código hace lo que estaba destinado a hacer, incluso si hace algo completamente inútil , todavía no es un error en mi libro. Es una solicitud de cambio de diseño, es decir, "Cambie el cmdlet para que realmente haga algo útil". :)
Ryan Ries
@RyanRies Incluso entonces, ¿es realmente razonable suponer que esto está destinado? ¿Hay algo más que el código en sí y su comportamiento que respalde la idea de que la opción del algoritmo MACTripleDES Get-FileHashdebería ser alguna forma de RNG contorneado?
Håkan Lindqvist