我试图从zscaler中混淆API密钥
https://help.zscaler.com/zia/api-getting-started,但他们没有PowerShell的文档。
我做了从javascript到powershell的转换:这里是您的信息的功能
Function Obfuscate {
PARAM (
[Parameter(Mandatory=$true,HelpMessage="apiKey")][String] $key,
[Parameter(Mandatory=$true,HelpMessage="Timestamp")]$timestamp
)
$apiKey=""
$high=$Timestamp.substring($timestamp.length -6)
$low=$high -shr 1
$low=$low.ToString()
While ($low.length -lt 6) {$low="0"+$low}
For ($i=0;$i -lt $high.length; $i++) {
$apiKey+=$key.substring($high.substring($i,1) -shr 0,1)
}
For ($i=0;$i -lt $low.length; $i++) {
$apiKey+=$key.substring(($low.substring($i,1) -shr 0)+2,1)
}
return $apiKey
}
它只是一个问题,非常烦人:
javascript / java / python中的Date.now()(用于timestamp变量)和son返回一个13位数字(1519984360183)(应该是1970/01/01 00:00:00:00以来的第二个时间)
PowerShell中的类似功能:
$timestamp=([Math]::Floor([decimal](Get-Date(Get-Date).ToUniversalTime()-uformat "%s"))).tostring()
要么
$timestamp = (Get-Date -UFormat %s)
返回一个15位数字
运行脚本以发送带有15位时间戳的发布请求会产生错误,因为Zscaler服务器无法识别混淆的api密钥。
任何的想法 ?
Get-Date -UFormat %s
以(小数)秒返回(字符串化)值,两者都是Unix time的表示,但是在不同的单位(并且具有不同的数字类型)。
因此,您需要乘以1000
并将结果转换为整数(如果最终需要字符串表示,则将结果转换为[string]
或应用.ToString()
):
$timestamp = [Math]::Floor(1000 * (Get-Date ([datetime]::UtcNow) -UFormat %s))
([datetime]::UtcNow)
将当前时间点作为UTC时间戳返回,这是必要的,因为Unix时间以UTC表示;它是(Get-Date).ToUniversalTime()
的更短(和更快)的等价物1000
作为乘法的LHS,*
PowerShell自动将RHS转换为数字 - 在这种情况下为[double]
。[Math]:Floor()
然后截断那个双倍(掉落小数部分);如果你需要一个实际的整数类型,请转换为[int64]
。