Powershell和Ruby中的SHA1哈希结果不同



我们在powershell中编写了脚本,用于从用户终端获取一些信息。并创建了该信息的SHA1,只是为了验证结果的完整性。

在服务器端,我们从多个终端获得这些信息,我们正在验证每一个结果,脚本的这一边是用Ruby编写的。

现在的问题是,这两个脚本都给出了不同的SHA1哈希,我不确定我在哪里犯了错误。

Powershell代码如下所示。

$String = "
Directory: D:OneDrive -
ControlCasejt-workevidance-collectionevidances-textPCI_Evidences_CCIN-CAS-VKAUSevidences

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2019-01-16   1:14 PM       7073 21_to_calc_hash.ps1
-a---        2019-01-16   1:15 PM       9973 CCIN-CAS-VKAUS_pci_evidence_Q21.txt
-a---        2019-01-15   9:37 PM      67399 CCIN-CAS-VKAUS_pci_evidence_Q23.txt
-a---        2019-01-15   9:37 PM       5055 CCIN-CAS-VKAUS_pci_evidence_Q34.txt
-a---        2019-01-15   9:38 PM      10820 CCIN-CAS-VKAUS_pci_evidence_Q45.txt
-a---        2019-01-15   9:38 PM      13129 CCIN-CAS-VKAUS_pci_evidence_Q50.txt
-a---        2019-01-15   9:38 PM       7163 CCIN-CAS-VKAUS_pci_evidence_Q67.txt
-a---        2019-01-15   9:39 PM       4301 CCIN-CAS-VKAUS_pci_evidence_Q69.txt
-a---        2019-01-15   9:39 PM       2900 CCIN-CAS-VKAUS_pci_evidence_Q81.txt
"
Function Get-Hash([String] $String)
{ 
$StringBuilder = New-Object System.Text.StringBuilder 
[System.Security.Cryptography.HashAlgorithm]::Create("sha1").ComputeHash([System.Text.Encoding]::UTF8.GetBytes($String))|%{ 
[Void]$StringBuilder.Append($_.ToString("x2")) 
} 
$StringBuilder.ToString() 
}
Get-Hash($String)

这是我们为上面的脚本e7c527068445c52635287b9ecf55566c2564d595获得的哈希

下面是Ruby脚本

require 'digest'
varj = "
Directory: D:OneDrive -
ControlCasejt-workevidance-collectionevidances-textPCI_Evidences_CCIN-CAS-VKAUSevidences

Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        2019-01-16   1:14 PM       7073 21_to_calc_hash.ps1
-a---        2019-01-16   1:15 PM       9973 CCIN-CAS-VKAUS_pci_evidence_Q21.txt
-a---        2019-01-15   9:37 PM      67399 CCIN-CAS-VKAUS_pci_evidence_Q23.txt
-a---        2019-01-15   9:37 PM       5055 CCIN-CAS-VKAUS_pci_evidence_Q34.txt
-a---        2019-01-15   9:38 PM      10820 CCIN-CAS-VKAUS_pci_evidence_Q45.txt
-a---        2019-01-15   9:38 PM      13129 CCIN-CAS-VKAUS_pci_evidence_Q50.txt
-a---        2019-01-15   9:38 PM       7163 CCIN-CAS-VKAUS_pci_evidence_Q67.txt
-a---        2019-01-15   9:39 PM       4301 CCIN-CAS-VKAUS_pci_evidence_Q69.txt
-a---        2019-01-15   9:39 PM       2900 CCIN-CAS-VKAUS_pci_evidence_Q81.txt
"
varj_Encoded = varj.encode(Encoding::ISO_8859_1)
puts Digest::SHA1.hexdigest(varj_Encoded)

这是我们从这个脚本中得到的SHA1。77f7cecb2b75c16b1e929a56b644fad7d7f95965

现在的条件是,我不能对Powershell部分进行任何更改。我需要调整ruby代码以使其匹配。

在这种情况下,编码没有什么区别,因为我们只处理ASCII字符,它们都以相同的方式编码ASCII。问题是

  1. 在这两种情况下,您的数据都不同,请注意第一个示例中DirectoryControlCase前面的空格,但第二个示例中没有。

  2. 您需要对ruby字符串中的反斜杠进行转义,或者它将它们解释为转义字符

一旦你解决了这两个问题,你会得到相同的结果:

PS:

PS H:\>$String=">>>>目录:D:\OneDrive->>控制案例\jt-work\evidance-collection\evidanices-text\PIC_evidances_CCIN-CAS-VKAUS\professions>>>>>>模式上次写入时间长度名称>>-------------------->>-a---2019-01-16下午1:14 7073 21_to_calc_ash.ps1>>-a--2019-01-16下午1:15 9973 CCIN-CAS-VKAUS_pci_evidance_Q21.txt>>-a--2019-01-15 9:37 PM 67399 CCIN-CAS-VKAUS_pci_evidance_Q23.txt>>-a--2019-01-15 9:37 PM 5055 CCIN-CAS-VKAUS_pci_evidance_Q34.txt>>-a--2019-01-15 9:38 PM 10820 CCIN-CAS-VKAUS_pci_evidance_Q45.txt>>-a--2019-01-15 9:38 PM 13129 CCIN-CAS-VKAUS_pci_evidance_Q50.txt>>-a--2019-01-15 9:38 PM 7163 CCIN-CAS-VKAUS_pci_evidance_Q67.txt>>-a--2019-01-15 9:39 PM 4301 CCIN-CAS-VKAUS_pci_evidance_Q69.txt>>-a--2019-01-15 9:39 PM 2900 CCIN-CAS-VKAUS_pci_evidance_Q81.txt>>>>"PS H:\>获取哈希($string)6454c0ecf1700448fb2496037a1e9ce496b185cd

Ruby:

>varj="。。..目录:D:\\OneDrive-..控制案例\\jt-work\\evidance-collection\\evidanices-text\\PCI_evidances_CCIN-CAS-VKAUS\\recisions。。。。..模式上次写入时间长度名称..---------------------------------------------..-a---2019-01-16下午1:14 7073 21_to_calc_hash.ps1..-a--2019-01-16下午1:15 9973 CCIN-CAS-VKAUS_pci_evidance_Q21.txt..-a--2019-01-15 9:37 PM 67399 CCIN-CAS-VKAUS_pci_evidance_Q23.txt..-a--2019-01-15 9:37 PM 5055 CCIN-CAS-VKAUS_pci_evidance_Q34.txt..-a--2019-01-15 9:38 PM 10820 CCIN-CAS-VKAUS_pci_evidance_Q45.txt..-a--2019-01-15 9:38 PM 13129 CCIN-CAS-VKAUS_pci_evidance_Q50.txt..-a--2019-01-15 9:38 PM 7163 CCIN-CAS-VKAUS_pci_evidance_Q67.txt..-a--2019-01-15 9:39 PM 4301 CCIN-CAS-VKAUS_pci_evidance_Q69.txt..-a--2019-01-15 9:39 PM 2900 CCIN-CAS-VKAUS_pci_evidance_Q81.txt。。..">>放入Digest::SHA1.hextdigest(varj.encode(编码::UTF_8))=>6454c0ecf1700448fb2496037a1e9ce496b185cd>>puts Digest::SHA1.hexdigest(varj.encode(编码::ISO_8859_1))=>6454c0ecf1700448fb2496037a1e9ce496b185cd

编辑:

如果您仍然无法匹配,我认为最好的方法是比较每个字符串的字节值以确定差异。

PS:

PS H:\>$enc=[system.Text.Encoding]::UTF8PS H:\>$enc。GetBytes($String)10103232…

Ruby:

>varj_Encoded.bytes.to_a=>[10,10,32,32,…

正如Persistent13在评论中提到的,编码差异是最有可能的原因。中的编码类。Net有一些与常见编码相对应的静态成员,但ISO-8859-1不是其中之一。你可以用[System.Text.Encoding]::GetEncodings()看到其余的,用[System.Text.Encoding]::GetEncoding()可以得到一个特定的(有一些重载)。

例如,试试这个:

$bytes = [System.Text.Encoding]::GetEncoding('iso-8859-1').GetBytes($string)
[System.Security.Cryptography.HashAlgorithm]::Create("sha1").ComputeHash($bytes)

由于您无法更改PowerShell部分,因此可以这样做只是为了在控制台中测试理论。

或者直接转到将Ruby更改为使用UTF8的部分。

varj_Encoded = varj.encode(Encoding::UTF-8)
puts Digest::SHA1.hexdigest(varj_Encoded)

最新更新