Почему выходные данные алгоритма MacTripleDes в PowerShell не стабильны?

14

Я проверяю хэши файлов, используя несколько различных алгоритмов в powershell. Когда я использую MacTripleDes, я всегда получаю разные хэши. Все остальные, такие как SHA256 или MD5, всегда дают надежные ответы. Вы можете повторить проблему на своем компьютере:

"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

Я получаю одинаковые значения хэша для первых двух хэшей, но разные значения для вторых двух хэшей. MacTripleDes должен использоваться по-другому?

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
источник
3
MACTripleDES - это алгоритм хеширования с ключом . Get-FileHashКомандлет не появляется , чтобы поддержать ключевой параметр.
Jscott
Это звучит как ошибка. Таким образом, этот комментарий, кажется, лучший ответ. Но я не вижу, как это пометить.
user6722022

Ответы:

18

MACTripleDES отличается от других алгоритмов, предлагаемых Get-FileHashкомандлетом. Я не уверен, почему он был включен в командлет, если честно. Это не соответствует другим, ИМО.

SHA1, SHA256, MD5, RIPEMD и т. Д., Все это обычные хеш-функции. Они берут некоторые данные произвольной длины и создают дайджест фиксированной длины, который представляет эти данные. MACTripleDES отличается тем, что это не просто алгоритм хеширования. У него есть TripleDES в названии, а 3DES - это алгоритм шифрования, а не алгоритм хеширования. Самое большое различие между хэш-функциями и функциями шифрования заключается в том, что шифрование можно изменить ключом. Хеши являются односторонними функциями.

А MAC обозначает код аутентификации сообщения. Это код, который используется для аутентификации сообщения. Чтобы убедиться, что это не было подделано. MAC разработаны, чтобы быть эфемерными или уникальными от одного сообщения до следующего.

Проверьте конструктор :

 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 генерирует случайные числа ... случайные числа означают, что результат будет отличаться при каждом запуске.

Райан Райс
источник
Да, это совершенно бесполезно здесь. При правильном использовании вы либо передаете известный ключ в конструктор, либо извлекаете случайный ключ из KeyedHashAlgorithmобъекта. Но и с этим ничего нельзя поделать Get-FileHash...
Боб
1
Если Get-FileHashне позволяет вам указать ключ для использования, и вместо этого генерирует случайный ключ, который он никогда не предоставляет пользователю, то это действительно ошибка (согласно оригинальному названию вопроса), которую вы не можете использовать на самом деле это ни для чего. (Не то, чтобы я понимал, почему вы бы выбрали MACTripleDES в первую очередь, если бы вы хотели MAC.)
Håkan Lindqvist
@ HåkanLindqvist Я понимаю вашу точку зрения, но это зависит от вашего определения ошибки. Если код выполняет то, для чего он предназначен, даже если он делает что-то совершенно бесполезное , это все равно не ошибка в моей книге. Это запрос на изменение дизайна, т. Е. «Пожалуйста, измените командлет, чтобы он действительно делал что-то полезное». :)
Райан Рис
@RyanRies Даже тогда, действительно ли разумно предположить, что это предназначено? Есть ли что-нибудь, кроме самого кода и его поведения, которое поддерживает идею, что опция алгоритма MACTripleDES Get-FileHashдолжна быть какой-то формой извилистого ГСЧ?
Хокан Линдквист