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


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   

3
MACTripleDES是一种密钥哈希算法。该Get-FileHashcmdlet似乎不支持关键参数。
jscott

听起来像个虫子。因此,此评论似乎是最佳答案。但是我看不出如何标记它。
user6722022

Answers:


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; 
        ...

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


是的,在这里没什么用。在适当的用法中,您可以将已知键传递给构造函数,或者从KeyedHashAlgorithm对象中检索随机键。但是,这两种方法都没有关系Get-FileHash……
鲍勃

1
如果Get-FileHash不允许您指定要使用的密钥,而是生成了一个永远不会公开给用户的随机密钥,则这似乎是一个错误(根据问题的原始标题),因为您实际上无法使用它为任何。(不,我理解你为什么会选择MACTripleDES摆在首位,如果你想要一个MAC)
哈坎·林奎斯特

@HåkanLindqvist我明白您的意思,但这取决于您对错误的定义。如果代码能够实现预期的目的,即使它做的事情完全没有用,那仍然不是我书中的错误。这是一个设计更改请求,即“请更改cmdlet,以便它实际上可以做一些有用的事情。” :)
瑞安·里斯

@RyanRies即使到那时,假设这样做是合理的吗?除了代码本身及其行为之外,没有什么可以支持MACTripleDES算法选项Get-FileHash应为某种形式的复杂RNG 的想法吗?
哈坎·林德奎斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.