2017-03-23 54 views
0

我正在尝试base64编码从REST平台读取的文件列表上的sha1哈希值。读回的文件工作正常,事实上整个脚本工作正常,但问题是,我只能解决如何Base64编码的SHA1哈希的字符串表示,但我需要B64编码实际的哈希,而不是散列的字符串。在Powershell中的Base64编码

下面是我使用的一些代码,但我不想B64编码散列的字符串,但散列本身。

作为一个例子,我对一个文件的代码输出如下,第一个是由另一个系统计算的散列,B64编码原始散列,第二个散列是由我们的代码创建的散列,B64编码哈希的字符串值完全不同。

任何帮助,将不胜感激。

源文件: /REST/CCLAIMS/053/17667053 AERTRMT1xZNrW9TTl6k6Orryiwc12gtJQfJSnlOeWGI =

目标文件哈希 /REST/CCLAIMS/053/17667053 M0U1NDY0NDk1NEJDNjVBRTNEMEU3M0JBNTkyNzk4QzMwQ0M3MEU2NA ==

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() 
} 

$hash = "SHA1" 

$filehash = Get-FileHash -Path C:\Temp\PS\output.file -Algorithm $hash 
$hashvalue = [system.text.encoding]::UTF8.GetBytes($filehash.Hash) 
    add-content $outputfile ($line + "," + $filehash.Hash + "," + [system.convert]::ToBase64String($hashvalue)) 
} Catch { 
    $errormessage = $_.Exception.Message 
    add-content $outputerrorfile ($line + "," + "Error "+$errormessage) 
}  

回答

0

讲讲你的代码是格式不正确的,所以我不完全确定你的初衷是在那里。总之,这里是(使用https://cyber-defense.sans.org/blog/2010/02/11/powershell-byte-array-hex-convert作为模板)一个天真转换为字节数组从一个十六进制字符串:

function Naive-Convert-HashToByteArray { 
    [CmdletBinding()] 
    Param ([Parameter(Mandatory = $True, ValueFromPipeline = $True)] [String] $String) 
    $String -split '([A-F0-9]{2})' | foreach-object { if ($_) {[System.Convert]::ToByte($_,16)}} 
} 

然后

$filehash = Get-FileHash -Path C:\Temp\PS\output.file -Algorithm $hash 
$filehash_as_bytes = Naive-Convert-HashToByteArray($filehash.Hash) 
[System.Convert]::ToBase64String($filehash_as_bytes) 

应该产生编码你正在寻找的结果。你应该能够将它连接到你想要的东西并从那里写入文件。

(“幼稚”的名字有意味着它是假设输入字符串长于单个字符,并且所述.Hash属性是从该对象,这似乎是合理的假设的特定格式)