将PowerShell日期转换为JavaScript日期(Unix时间)

3

我试图从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()(用于时间戳变量)返回一个13位数字(例如1519984360183),表示自1970年1月1日00:00:00:00以来的秒数。

Powershell中类似的函数:

$timestamp=([Math]::Floor([decimal](Get-Date(Get-Date).ToUniversalTime()-uformat "%s"))).tostring()

或者

$timestamp = (Get-Date -UFormat %s)

返回一个15位数字

运行脚本以使用15位时间戳发送POST请求会出现错误,因为Zscaler服务器无法识别混淆的API密钥。

有什么想法吗?

1个回答

4
注意:下面的答案纠正了您自己的方法,但请注意,在 Windows PowerShell 5.1 和 PowerShell (Core) 中存在一种更简单的解决方案:
# PSv5.1+
$timestamp = [datetimeoffset]::Now.ToUnixTimeMilliSeconds()

注意:上述内容直接返回整秒数(作为[long]实例),对分数秒部分进行(四舍五入)舍入以返回整数表示,这与您自己的截断方法不同。


修正您的尝试:

  • Get-Date -UFormat %s 返回一个(带小数的)秒数值,
  • 然而JavaScript使用(整数的)毫秒数

两者都是Unix(纪元)时间的表示,但单位不同(并且具有不同的数字类型)。

因此,您需要乘以1000并将结果转换为整数(如果最终需要字符串表示,则简单地将结果强制转换为[string]或应用.ToString()):

$timestamp = [Math]::Floor(
  1000.0 * [double]::Parse((Get-Date ([datetime]::UtcNow) -UFormat %s))
)
  • ([datetime]::UtcNow) 返回当前时间点的UTC时间戳,这是必要的,因为Unix时间以UTC表示;它是(Get-Date).ToUniversalTime()的更短(更快)等效形式。

    • 注意:在Windows PowerShell中获取正确的结果,您必须提供一个UTC日期作为输入(一个[datetime]实例,其.Kind值为Utc)。这在PowerShell (Core) v7+中不再需要。
  • [double]::Parse()Get-Date的字符串输出解析为一个[double]实例,使用与区域设置相关的解析(而[double]转换将是与区域设置无关的,并且只接受.作为小数标记)。

    • 请注意,在PowerShell (Core) v7+中,Get-Date -UFormat %s现在更合理地返回表示整数的字符串,即整秒
  • [Math]:Floor()然后截断该双精度浮点数(删除小数部分);结果是一个[double],但没有小数位。如果需要实际的整数类型,请转换为[long]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接