Tools/Cryptography.ps1
function Invoke-HMACSHA256Hash { param ( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string] $Value, [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string] $Secret ) $crypto = [System.Security.Cryptography.HMACSHA256]::new([System.Text.Encoding]::UTF8.GetBytes($Secret)) return [System.Convert]::ToBase64String($crypto.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($Value))) } function Invoke-SHA256Hash { param ( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string] $Value ) $crypto = [System.Security.Cryptography.SHA256]::Create() return [System.Convert]::ToBase64String($crypto.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($Value))) } function Invoke-CookieSign { param ( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string] $Value, [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string] $Secret ) return "s:$($Value).$(Invoke-HMACSHA256Hash -Value $Value -Secret $Secret)" } function Invoke-CookieUnsign { param ( [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string] $Signature, [Parameter(Mandatory=$true)] [ValidateNotNullOrEmpty()] [string] $Secret ) if (!$Signature.StartsWith('s:')) { return $null } $Signature = $Signature.Substring(2) $periodIndex = $Signature.LastIndexOf('.') $value = $Signature.Substring(0, $periodIndex) $sig = $Signature.Substring($periodIndex + 1) if ((Invoke-HMACSHA256Hash -Value $value -Secret $Secret) -ne $sig) { return $null } return $value } |