引用与jsign
bug report相关的jsign
。
我玩过VBScript和JScript文件,看起来像哈希方法不同于PowerShell脚本。对于PowerShell,内容在被散列之前已转换为How to validate authenticode for Javascript in C#。对于VB和JS,它不起作用,生成的哈希值与signtool计算的哈希值不同。我尝试了各种编码(
UTF-16LE
,UTF-8
,UTF-16BE
,带有或不带有字节顺序标记),但仍然不匹配。
[没有UTF-32BE/LE
(并且没有任何专有和/或Microsoft工具的人如何创建.vbs
签名块?]
编辑:
到目前为止,我已经观察到以下内容:
signtool.exe
使用SHA-1签名。可以通过signtool.exe
/fd sha256
添加到签名中,从而引发完全的签名匹配。供参考,这是使用some additional properties时最终产品签名的外观。
signtool.exe
此签名的目的是允许Windows验证文件的发布者。它不是文档完善的标准,但是可以在'' SIG '' Begin signature block
'' SIG '' MIIM4AYJKoZIhvcNAQcCoIIM0TCCDM0CAQExCzAJBgUr
' ... (a bunch of bas64 data) ...
'' SIG '' cSu0HJyT7v9OctFKlKj7aCB6JHPrR0il9GFdoZrQFNuU
'' SIG '' End signature block
中找到。
现代目的可能包括将solutions like this文件作为独立脚本或作为应用程序的一部分运行。利用Windows的内置验证机制,可以为需要脚本的环境添加信任层。
引用Don Jones的“使用VBScript和WMI管理Windows”的第28章。
仅运行签名脚本
如果您不想弄乱软件限制策略,也可以依靠WSH自己内置的安全策略。该策略允许您指定仅运行签名的脚本。未签名的脚本将不会。这可能是防止大多数未授权脚本的最简单,最有效的方法。
数字签名非常普遍,因此我们不应受到.vbs
之类的封闭源实用程序的限制。
引用signtool.exe
的JSign的作者Emmanuel Bourg,这激发了这个问题:
我知道了,脚本确实在bug中进行了散列,但是将编码为4字节小端整数的无符号文件的大小添加到了散列中。
因此,普通的散列算法将对UTF-16LE
(hashable content,SHA-1
)起作用,但是为了传递SHA-256
,需要将另外的4个字节添加到散列数据中。