Warum ist die Ausgabe des MacTripleDes-Algorithmus in PowerShell nicht stabil?

14

Ich überprüfe die Datei-Hashes mit verschiedenen Algorithmen in Powershell. Wenn ich MacTripleDes verwende, erhalte ich immer verschiedene Hashes. Alle anderen, wie z. B. SHA256 oder MD5, geben immer zuverlässige Antworten. Möglicherweise können Sie das Problem auf Ihrem eigenen Computer replizieren:

"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

Ich erhalte die gleichen Hash-Werte für die ersten beiden Hashes, aber unterschiedliche Werte für die zweiten beiden Hashes. Soll MacTripleDes anders verwendet werden?

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   
user6722022
quelle
3
MACTripleDES ist ein Schlüssel Hashing - Algorithmus. Das Get-FileHashCmdlet scheint keinen Schlüsselparameter zu unterstützen.
Jscott
Das klingt nach einem Bug. Dieser Kommentar scheint also die beste Antwort zu sein. Aber ich sehe nicht, wie ich es als solches markieren soll.
user6722022

Antworten:

18

MACTripleDES unterscheidet sich von den anderen vom Get-FileHashCmdlet angebotenen Algorithmen. Ich bin mir nicht sicher, warum es in das Cmdlet aufgenommen wurde, um ehrlich zu sein. Es passt nicht zu den anderen, IMO.

SHA1, SHA256, MD5, RIPEMD usw. sind reguläre Hash-Funktionen. Sie nehmen einige Daten beliebiger Länge und erstellen einen Digest fester Länge, der diese Daten darstellt. MACTripleDES unterscheidet sich jedoch darin, dass es sich nicht nur um einen Hash-Algorithmus handelt. Der Name lautet TripleDES, und 3DES ist ein Verschlüsselungsalgorithmus, kein Hashing-Algorithmus. Der größte Unterschied zwischen Hash-Funktionen und Verschlüsselungsfunktionen besteht darin, dass die Verschlüsselung mit einem Schlüssel rückgängig gemacht werden kann. Hashes sind Einwegfunktionen.

Und MAC steht für Message Authentication Code. Es ist ein Code, der zur Authentifizierung einer Nachricht verwendet wird. Um sicherzustellen, dass es nicht manipuliert wurde. MACs sind so konzipiert, dass sie von einer Nachricht zur nächsten flüchtig oder eindeutig sind.

Schauen Sie sich den Konstruktor an :

 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 generiert Zufallszahlen ... Zufallszahlen bedeuten, dass das Ergebnis bei jedem Lauf anders sein wird.

Ryan Ries
quelle
Ja, es ist hier ziemlich nutzlos. Bei ordnungsgemäßer Verwendung würden Sie entweder einen bekannten Schlüssel an den Konstruktor übergeben oder den zufälligen Schlüssel aus dem KeyedHashAlgorithmObjekt abrufen . Aber es gibt auch keine Möglichkeit Get-FileHash...
Bob
1
Wenn Get-FileHashSie den zu verwendenden Schlüssel nicht angeben können und stattdessen einen zufälligen Schlüssel generieren, der dem Benutzer niemals zugänglich gemacht wird, handelt es sich anscheinend um einen Fehler (gemäß dem Originaltitel der Frage), den Sie nicht verwenden können es für alles. (Ich verstehe nicht, warum Sie sich für MACTripleDES entschieden haben, wenn Sie einen MAC wollten.)
Håkan Lindqvist,
@ HåkanLindqvist Ich verstehe deinen Standpunkt, aber es hängt von deiner Definition eines Fehlers ab. Wenn der Code das tut, was er tun soll, selbst wenn er etwas völlig Nutzloses tut , ist er immer noch kein Fehler in meinem Buch. Es handelt sich um eine Entwurfsänderungsanforderung, dh "Ändern Sie das Cmdlet, damit es tatsächlich etwas Nützliches bewirkt." :)
Ryan Ries
@ RyanRies Auch dann ist es wirklich vernünftig anzunehmen, dass dies beabsichtigt ist? Gibt es etwas anderes als den Code selbst und sein Verhalten, das die Idee stützt, dass die MACTripleDES-Algorithmusoption Get-FileHasheine Form von verschachteltem RNG sein sollte?
Håkan Lindqvist