脚本签名全解析:保障脚本安全与完整性
1. 脚本签名概述
脚本签名是一种以安全方式添加额外信息来识别脚本发布者的过程。这里的“安全方式”意味着你可以验证以下两点:
- 脚本确实由正确的人签名。
- 自签名以来,脚本的内容没有以任何方式更改。
2. 公钥加密和单向哈希的工作原理
脚本签名借助两种技术实现:公钥加密和单向哈希。
公钥加密使用两个密钥:一个用于加密信息的私钥,以及一个用于解密用私钥加密的数据的公钥。
单向哈希函数是一种对于任何输入都易于计算输出,但仅根据输出很难恢复输入的函数。此外,这些哈希函数还需要具备抗碰撞性,即两个不同输入产生相同输出的可能性极低。
以下是使用这些技术验证脚本真实性和完整性的步骤:
1. 脚本作者(或发布者)使用安全的哈希算法计算脚本内容的单向哈希。
2. 这个哈希值随后用发布者的私钥进行加密,并以注释块的形式附加到脚本中。
3. 脚本被交付给要运行它的用户。
4. 在运行脚本之前,PowerShell 移除签名块,然后使用与发布者相同的算法计算文档的单向哈希。
5. PowerShell 使用发布者的公钥解密签名注释块中包含的哈希值。
6. 最后,将计算得到的哈希值与从签名块中恢复的哈希值进行比较。如果它们匹配,则脚本由私钥的所有者创建且未被篡改;如果不匹配,则脚本被拒绝,可能是未由发布者合法签名或已被篡改。
然而,这里有一个小问题:我们如何获得正确的公钥来解密签名呢?每次运行脚本都给发布者打电话显然不现实。这就引入了签名机构和证书的概念。