我在 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
答案1
MACTripleDES 与 cmdlet 提供的其他算法不同Get-FileHash
。老实说,我不确定为什么它会包含在 cmdlet 中。在我看来,它与其他算法不相符。
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 生成随机数...随机数意味着每次运行的结果都会不同。