我们在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。问题是
-
在这两种情况下,您的数据都不同,请注意第一个示例中
Directory
和ControlCase
前面的空格,但第二个示例中没有。 -
您需要对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)