我们使用powershell编写了脚本,以从用户终端获取一些信息。并已创建该信息的SHA1,仅用于验证结果的完整性。
在服务器端,我们从多个终端获取这些信息,我们正在验证每个结果,并且脚本的这一端是用Ruby编写的。
现在的问题是,这两个脚本都给出了不同的SHA1哈希,并且我不确定在哪里出错。
Powershell代码如下。
$String = "
Directory: D:\OneDrive -
ControlCase\jt-work\evidance-collection\evidances-text\PCI_Evidences_CCIN-CAS-VKAUS\evidences
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 -
ControlCase\jt-work\evidance-collection\evidances-text\PCI_Evidences_CCIN-CAS-VKAUS\evidences
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部件中进行任何更改。我需要调整红宝石代码以使其匹配。
答案 0 :(得分:4)
在这种情况下,编码没有区别,因为我们只处理ASCII字符,并且它们都以相同的方式编码ASCII。问题是
两种情况下您的数据都不同,请注意第一个示例中Directory
和ControlCase
之前的空格,而第二个示例中没有空格。
您需要对红宝石字符串中的反斜杠进行转义,或者将其解释为转义字符
一旦解决了这两个问题,您将得到相同的结果:
PS:
PS H:\> $String = " >> >> Directory: D:\OneDrive - >> ControlCase\jt-work\evidance-collection\evidances-text\PCI_Evidences_CCIN-CAS-VKAUS\evidences >> >> >> 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 >> >> " PS H:\> Get-Hash($string) 6454c0ecf1700448fb2496037a1e9ce496b185cd
Ruby:
>> varj = " .. .. Directory: D:\\OneDrive - .. ControlCase\\jt-work\\evidance-collection\\evidances-text\\PCI_Evidences_CCIN-CAS-VKAUS\\evidences .. .. .. 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 .. .. " >> puts Digest::SHA1.hexdigest(varj.encode(Encoding::UTF_8)) => 6454c0ecf1700448fb2496037a1e9ce496b185cd >> puts Digest::SHA1.hexdigest(varj.encode(Encoding::ISO_8859_1)) => 6454c0ecf1700448fb2496037a1e9ce496b185cd
编辑:
如果您仍然无法匹配,我认为最好的方法是比较每个字符串的字节值以识别差异。
PS:
PS H:\> $enc = [system.Text.Encoding]::UTF8 PS H:\> $enc.GetBytes($String) 10 10 32 32 ...
Ruby:
>> varj_Encoded.bytes.to_a => [10, 10, 32, 32, ...
答案 1 :(得分:0)
正如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)