【问题标题】:Different MD5 hash result in Powershell vs PythonPowershell vs Python中不同的MD5哈希结果
【发布时间】:2018-09-05 00:24:34
【问题描述】:

当使用 Python 和 Powershell 计算 MD5 哈希时,我得到了不同的结果。 Python 代码似乎返回了“正确”的版本。

不使用多行变量时,结果是相同的。因此,如果我设置 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

它返回结果: 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

【问题讨论】:

  • 我也认为它与换行符有关。你为什么不检查?
  • @thatotherguy 我不知道如何检查,但任何关于如何在未来检查此类事情的建议都值得赞赏。谢谢。
  • 获取两个输入的十六进制转储并进行比较。你的 PS 代码已经有将字节格式化为十六进制的代码,而 Python 代码是 easy to find

标签: python powershell hash md5


【解决方案1】:

两个输入字符串实际上并不相同,原因有两个:

1) python 中的三引号字符串与引号在同一行开始和结束 - PowerShell 中的 here-strings 在 @"/@' 下方的行开始并在 "@/@ 上方的行结束987654324@,所以改一下:

$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 中的换行符此处字符串默认为[Environment]::NewLine,在Windows 中为\r\n,而python 默认为\n,因此请确保将它们标准化:

$obj = $obj.Replace([System.Environment]::NewLine,"`n")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2017-01-24
    • 2019-06-10
    • 2021-05-04
    • 1970-01-01
    • 2018-03-23
    相关资源
    最近更新 更多