我有一个模块,其中包含一些字符串,其中包含一些难以实现的私有数据,但经常更改。我需要将这个脚本放在可能被访问的各种机器上,并且由不应该使用用于获取输出的信息的人读取代码。
我真的很关心不时会发生变化的字符串所以我正在考虑创建一个脚本,提示这些值作为安全字符串并使用密钥加密它们并将它们转储到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文件中的加密密钥?
答案 0 :(得分:2)
然后在自己的上加密隐藏字符串是安全的,但它可能在该表单中无法使用。 ConvertTo-SecureString
会将其从加密的标准字符串转换为SecureString
,但为了做到这一点,您需要密钥。如果您的用户或脚本有密钥,那么他们可以做任何事情。
你甚至可以将SecureString
传递给你正在使用的任何应用程序,或者你需要将它转换回常规字符串吗?如果秘密数据在任何时候都是纯文本格式,那么您的用户就可以看到它。
即使您的应用程序支持SecureString
,您仍然需要处理,因为SecureString
非常容易破解:
[System.Runtime.InteropServices.Marshal]::PtrToStringAuto(
[System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($securestring)
)
使用某些密钥加密秘密数据但允许低私有用户拥有密钥的方法已被破坏。这相当于“我不想让我的朋友把钥匙交给我的房子,所以我会将钥匙锁在一个盒子里,然后把钥匙交给他。”
答案 1 :(得分:1)
如果运行脚本的sysem不可靠,则不需要付出任何努力。由于SecureString
处理需要密钥,脚本运行器必须知道它 - 如果它不可靠,则系统已经受到损害。
问题已经discussed了好几次。
SecureString
使用Windows的数据保护API。它可能足够强大,在实际情况下不会破碎 - 保存rubber hose密码分析。
如果您更详细地解释您想要实现的目标,可能有一些方法可以保护数据。
保护敏感数据的一种方法是将其保存在安全的系统中。为客户端提供一些预生成的令牌,例如GUID。每次客户端需要数据时,它都会将一个令牌发送到安全的远程系统。根据IP /日期/任何内容检查令牌,并且所有处理都在远程系统上完成。结果数据将返回给客户端。如果结果数据是自信的部分,这显然不起作用,但为什么要将这些信息发送到不可靠的系统呢?