为什么 PowerShell 中的 MacTripleDes 算法输出不稳定?

use*_*022 14 powershell hash

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

我得到前两个散列的相同散列值,但后两个散列的值不同。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   
Run Code Online (Sandbox Code Playgroud)

Rya*_*ies 18

MACTripleDES 与Get-FileHashcmdlet提供的其他算法不同。老实说,我不确定为什么它包含在 cmdlet 中。它不适合其他人,IMO。

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; 
        ...
Run Code Online (Sandbox Code Playgroud)

StaticRandomNumberGenerator 生成随机数...随机数意味着每次运行的结果都不同。