3

我有一个模块,其中包含一些带有一些私有数据的字符串,这些数据应该很难获得,但经常更改。我需要将此脚本放在可以访问它的各种机器上,并且代码由不应该拥有用于派生输出的信息的人读取。

我真的很担心不时更改的字符串,因此我正在考虑创建一个脚本,该脚本提示输入这些值作为安全字符串,并使用密钥对其进行加密并将它们转储到 xml 文件中。然后使用 XML 文件提供字符串。任何从该模块运行需要该数据的命令的人都必须提供密钥,以便可以解密字符串。

这基本上是我期望做的,但我将处理对象

$secure = Read-Host -AsSecureString
$encrypted =  ConvertFrom-SecureString -securestring $secure -key somekey
$encrypted | Export-Clixml testing.xml
$imported = Import-Clixml testing.xml
$value = ConvertTo-SecureString -string $imported -key somekey

我了解该字符串将使用 Rijndael 加密算法进行加密,我相信该算法也称为 AES。

如果可以访问脚本,需要多少努力才能破解它位于 xml 文件中的加密密钥?

4

2 回答 2

2

然后加密的秘密字符串本身是安全的,但它可能无法以这种形式使用。 ConvertTo-SecureString会将其从加密的标准字符串转换为SecureString,但为了做到这一点,您需要密钥。如果您的用户或脚本拥有密钥,那么他们可以做任何事情。

您甚至可以将它传递SecureString给您正在使用的任何应用程序,还是需要将其转换回常规字符串?如果秘密数据在任何时候都是明文形式,那么您的用户可以看到它。

即使您的应用程序支持SecureString,您仍然会感到沮丧,因为SecureString它很容易破解:

[System.Runtime.InteropServices.Marshal]::PtrToStringAuto(
  [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($securestring)
 )

用一些密钥加密秘密数据但允许低权限用户拥有密钥的方法被打破了。相当于“我不想让我的朋友拿到我家的钥匙,所以我把钥匙锁在一个盒子里,把盒子的钥匙给他”。

于 2012-09-20T20:53:59.397 回答
1

如果运行脚本的系统不可靠,则无需付出任何努力。由于SecureString处理需要密钥,脚本运行者必须知道它 - 如果它不可靠,则您的系统已经受到威胁。

这个问题已经讨论过好几次了。

SecureString使用 Windows 的数据保护 API。它可能足够坚固,在实际情况下牢不可破——除了橡胶软管密码分析。

如果您更详细地解释您要实现的目标,则可能有保护数据的方法。

保护敏感数据的一种方法是将其保存在安全系统中。给客户一些预先生成的令牌,比如 GUID。每次客户端需要数据时,它都会向安全的远程系统发送一个令牌。令牌会根据 IP/日期/其他内容进行检查,并且所有处理都在远程系统上完成。结果数据返回给客户端。如果结果数据是机密部分,这显然是行不通的,但你为什么要把这样的信息发送到不可靠的系统呢?

于 2012-09-20T20:22:38.920 回答