Powershell 与 Python 中不同的 MD5 哈希结果
Different MD5 hash result in Powershell vs Python
使用 Python 和 Powershell 计算 MD5 哈希值时,我得到了不同的结果。 Python 代码似乎 returns 'correct' 版本。
当不使用多行变量时,结果是一样的。因此,如果我设置 xml = 'test' 它们都会给出相同的结果。
我在想这可能与格式或换行符有关,但也可能是我的 Powershell 代码有其他问题。
当我使用 Powershell 计算哈希值时,我使用了这个:
Function Get-StringHash([String] $String,$HashName = "MD5")
{
$StringBuilder = New-Object System.Text.StringBuilder
[System.Security.Cryptography.HashAlgorithm]::Create($HashName).ComputeHash([System.Text.Encoding]::UTF8.GetBytes($String))|%{
[Void]$StringBuilder.Append($_.ToString("x2"))
}
$StringBuilder.ToString()
}
$xml = @"
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!DOCTYPE OPS_envelope SYSTEM 'ops.dtd'>
<OPS_envelope>
<header>
<version>0.9</version>
</header>
<body>
<data_block>
<dt_assoc>
<item key="protocol">XCP</item>
<item key="action">get</item>
<item key="object">nameserver</item>
<item key="domain">domainname</item>
<item key="attributes">
<dt_assoc>
<item key="name">all</item>
</dt_assoc>
</item>
</dt_assoc>
</data_block>
</body>
</OPS_envelope>
"@
$key = '12345'
$obj = $xml + $key
$signature = Get-StringHash $obj "MD5"
$signature
它returns结果:
1680ea9b5d8b09ef6c9bd02641246fc4
当我使用Python时:
import hashlib
xml = '''
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!DOCTYPE OPS_envelope SYSTEM 'ops.dtd'>
<OPS_envelope>
<header>
<version>0.9</version>
</header>
<body>
<data_block>
<dt_assoc>
<item key="protocol">XCP</item>
<item key="action">get</item>
<item key="object">nameserver</item>
<item key="domain">domainname</item>
<item key="attributes">
<dt_assoc>
<item key="name">all</item>
</dt_assoc>
</item>
</dt_assoc>
</data_block>
</body>
</OPS_envelope>
'''
key = '12345'
md5_obj = hashlib.md5()
md5_obj.update(xml + key)
signature = md5_obj.hexdigest()
print("SIGNATURE: " + signature)
它的结果是:
d2faf89015178b2ed50ed4a90cbab9ff
两个输入字符串实际上并不相同,原因有二:
1) python 中的 Triple-quoted 字符串在引号所在的同一行开始和结束 - PowerShell 中的 here-strings 在 @"
/[= 下面的行开始13=] 并在 "@
/'@
上方的行结束,因此更改为:
$xml = @'
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!DOCTYPE OPS_envelope SYSTEM 'ops.dtd'>
<OPS_envelope>
<header>
<version>0.9</version>
</header>
<body>
<data_block>
<dt_assoc>
<item key="protocol">XCP</item>
<item key="action">get</item>
<item key="object">nameserver</item>
<item key="domain">domainname</item>
<item key="attributes">
<dt_assoc>
<item key="name">all</item>
</dt_assoc>
</item>
</dt_assoc>
</data_block>
</body>
</OPS_envelope>
'@
2) PowerShell here-strings 中的换行符默认为 [Environment]::NewLine
,在 windows 中为 \r\n
,而 python 默认为 \n
,因此请确保将这些规范化:
$obj = $obj.Replace([System.Environment]::NewLine,"`n")
使用 Python 和 Powershell 计算 MD5 哈希值时,我得到了不同的结果。 Python 代码似乎 returns 'correct' 版本。
当不使用多行变量时,结果是一样的。因此,如果我设置 xml = 'test' 它们都会给出相同的结果。
我在想这可能与格式或换行符有关,但也可能是我的 Powershell 代码有其他问题。
当我使用 Powershell 计算哈希值时,我使用了这个:
Function Get-StringHash([String] $String,$HashName = "MD5")
{
$StringBuilder = New-Object System.Text.StringBuilder
[System.Security.Cryptography.HashAlgorithm]::Create($HashName).ComputeHash([System.Text.Encoding]::UTF8.GetBytes($String))|%{
[Void]$StringBuilder.Append($_.ToString("x2"))
}
$StringBuilder.ToString()
}
$xml = @"
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!DOCTYPE OPS_envelope SYSTEM 'ops.dtd'>
<OPS_envelope>
<header>
<version>0.9</version>
</header>
<body>
<data_block>
<dt_assoc>
<item key="protocol">XCP</item>
<item key="action">get</item>
<item key="object">nameserver</item>
<item key="domain">domainname</item>
<item key="attributes">
<dt_assoc>
<item key="name">all</item>
</dt_assoc>
</item>
</dt_assoc>
</data_block>
</body>
</OPS_envelope>
"@
$key = '12345'
$obj = $xml + $key
$signature = Get-StringHash $obj "MD5"
$signature
它returns结果: 1680ea9b5d8b09ef6c9bd02641246fc4
当我使用Python时:
import hashlib
xml = '''
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!DOCTYPE OPS_envelope SYSTEM 'ops.dtd'>
<OPS_envelope>
<header>
<version>0.9</version>
</header>
<body>
<data_block>
<dt_assoc>
<item key="protocol">XCP</item>
<item key="action">get</item>
<item key="object">nameserver</item>
<item key="domain">domainname</item>
<item key="attributes">
<dt_assoc>
<item key="name">all</item>
</dt_assoc>
</item>
</dt_assoc>
</data_block>
</body>
</OPS_envelope>
'''
key = '12345'
md5_obj = hashlib.md5()
md5_obj.update(xml + key)
signature = md5_obj.hexdigest()
print("SIGNATURE: " + signature)
它的结果是: d2faf89015178b2ed50ed4a90cbab9ff
两个输入字符串实际上并不相同,原因有二:
1) python 中的 Triple-quoted 字符串在引号所在的同一行开始和结束 - PowerShell 中的 here-strings 在 @"
/[= 下面的行开始13=] 并在 "@
/'@
上方的行结束,因此更改为:
$xml = @'
<?xml version='1.0' encoding='UTF-8' standalone='no'?>
<!DOCTYPE OPS_envelope SYSTEM 'ops.dtd'>
<OPS_envelope>
<header>
<version>0.9</version>
</header>
<body>
<data_block>
<dt_assoc>
<item key="protocol">XCP</item>
<item key="action">get</item>
<item key="object">nameserver</item>
<item key="domain">domainname</item>
<item key="attributes">
<dt_assoc>
<item key="name">all</item>
</dt_assoc>
</item>
</dt_assoc>
</data_block>
</body>
</OPS_envelope>
'@
2) PowerShell here-strings 中的换行符默认为 [Environment]::NewLine
,在 windows 中为 \r\n
,而 python 默认为 \n
,因此请确保将这些规范化:
$obj = $obj.Replace([System.Environment]::NewLine,"`n")