PowerShell脚本中密码加密保存

在做自动化的时候会使用到PowerShell脚本,有时候会有远程连接其他服务器的场景,例如连接VMware vCenter Server,出于安全考虑,不建议将密码明文的方式保存在脚本中,可以使用SecureString的方式加密保存。

SecureString 是 .net 中的一个类型,它是为了解决安全性而设计出来的一种特殊的字符串类型。比如你使用一个密码字符串创建 SecureString 对象,你无法通过这个对象还原出原来的密码字符串,但是却可以把 SecureString 对象当做密码使用。
Encrypted Standard String 是指经过加密后的一个字符串。

ConvertTo-SecureString命令可以通过明文的字符串创建SecureString对象:

$SecurePwd = ConvertTo-SecureString "password" -AsPlainText -Force

接下来通过ConvertFrom-SecureString,我们可以把一个SecureString对象转换成Encrypted Standard String。在创建Credential的时候使用生成的Encrypted Standard String,从而避免密码以明文的方式保存在系统中。

那我们在脚本中如何使用这一长串的经过转换的字符串呢?还是使用ConvertTo-SecureString。参照如下脚本:

$SecurePwd = ConvertTo-SecureString "password" -AsPlainText -Force
ConvertFrom-SecureString $SecurePwd
01000000d08c9ddf0115d1118c7a00c04fc297eb010000007e60d35c88a6754d97d685911ef7ce3a000000000200000000001066000000010000200000004f64c1c377a3d41cd7f5126ee11de07ade363c1fe75a7046e19f1c3564c2616a000000000e8000000002000020000000d89d6a13999fdae8f3aa94a3391e4577e7007a23058df3dd775baef097a5721d200000009f319764aaa0333a6ebbb535794d9193c02195bb710922bccb223cb4482fe48b40000000bf4e33bad709c942feeafdc5a1f3b254c17b3274212caa5219857f2621252d75f5e983bbf9afc92430cc120a2d585ab73b45943ea8c87e696039a70601d90fbd
$encryptedText = "01000000d08c9ddf0115d1118c7a00c04fc297eb010000007e60d35c88a6754d97d685911ef7ce3a000000000200000000001066000000010000200000004f64c1c377a3d41cd7f5126ee11de07ade363c1fe75a7046e19f1c3564c2616a000000000e8000000002000020000000d89d6a13999fdae8f3aa94a3391e4577e7007a23058df3dd775baef097a5721d200000009f319764aaa0333a6ebbb535794d9193c02195bb710922bccb223cb4482fe48b40000000bf4e33bad709c942feeafdc5a1f3b254c17b3274212caa5219857f2621252d75f5e983bbf9afc92430cc120a2d585ab73b45943ea8c87e696039a70601d90fbd"
$encryptedPassword = $encryptedText | ConvertTo-SecureString
$cred = New-Object -TypeName System.Management.Automation.PSCredential("JustGiveAName", $encryptedPassword)
$username = "admin"
$password = $cred.GetNetworkCredential().Password

这样在脚本中使用用户名和密码的时候就直接调用$username和$password变量啦。

但是使用这种方法还是有一个限制,就是生成的那一长串字符自能在当前机器上使用,如果复制到其他机器上使用,就会在执行ConvertTo-SecureString时报错。这是一种安全限制,如果需要在其他机器使用,需要采用新的办法,使用一个Key文件来生成这个加密后的长字符串。

ConvertTo-SecureSting和ConvertFrom-SecureString命令都支持选项-key。在处理密码时通过Key选项可以提供额外的安全性以及在多台机器上使用加密后密码的能力:

首先生成32位的Key文件,并保存在AES.key文件中:

$keyFile = "D:\aes.key"
$key = New-Object Byte[] 32
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($key)
$key | out-file $keyFile

使用key生成加密后的密码字符串:

$SecurePwd = ConvertTo-SecureString "password" -AsPlainText -Force
ConvertFrom-SecureString $SecurePwd -key $key
76492d1116743f0423413b16050a5345MgB8AGcAcQBKADkANgBvAGIAdQAxAGIAMQA1ADgAZQAzADUAVQBTADIAcwBIAEEAPQA9AHwAZQAxAGYAOAAyAGEAZQA4ADUAMABjADcANwA2ADAAYwAwAGMAOQBjAGIAYQBiAGQAYgBiAGIAMQAwADIAMgA3ADgAMQA3ADcANABhADkAZABjADQAOAA5AGMAZQBhADcAZQA2AGYAMQBmADkAMwBlADIANgA2ADEANwA2ADIAOAA=
$encryptedText = "76492d1116743f0423413b16050a5345MgB8AGcAcQBKADkANgBvAGIAdQAxAGIAMQA1ADgAZQAzADUAVQBTADIAcwBIAEEAPQA9AHwAZQAxAGYAOAAyAGEAZQA4ADUAMABjADcANwA2ADAAYwAwAGMAOQBjAGIAYQBiAGQAYgBiAGIAMQAwADIAMgA3ADgAMQA3ADcANABhADkAZABjADQAOAA5AGMAZQBhADcAZQA2AGYAMQBmADkAMwBlADIANgA2ADEANwA2ADIAOAA="
$keyFile = "D:\aes.key"
$key = Get-Content $keyFile
$username = "admin"
$Cred = New-Object -TypeName System.Management.Automation.PSCredential `
          -ArgumentList $username, ($encryptedText | ConvertTo-SecureString -Key $key)
$password = $cred.GetNetworkCredential().Password

此条目发表在Powershell分类目录。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注