引言
笔者在《PowerShell 远程执行任务》一文中提到了在脚本中使用用户名和密码的基本方式:
$Username = 'xxxx' $Password = 'yyyy' $Pass = ConvertTo-SecureString $Password -AsPlainText -Force $Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$Pass
上面的代码仅仅是能工作而已,因为在稍有安全性要求的环境中都不会允许明文密码的出现。本文将介绍在 PowerShell 脚本中如何以比较安全的方式使用密码。
把密码转为 SecureString
先来了解下面两个概念:
SecureString Encrypted Standard String
SecureString 是 .net 中的一个类型,它是为了解决安全性而设计出来的一种特殊的字符串类型。比如你使用一个密码字符串创建 SecureString 对象,你无法通过这个对象还原出原来的密码字符串,但是却可以把 SecureString 对象当做密码使用。
Encrypted Standard String 是指经过加密后的一个字符串。
ConvertTo-SecureString 命令可以通过明文的字符串创建 SecureString 对象:
$SecurePwd = ConvertTo-SecureString "123456" -AsPlainText -Force
然后再使用 $SecurePwd 创建 Credential 等身份信息。这种方式就是笔者在引言部分使用的方法,这是不安全的,因为任何能够查看脚本的人都能从中找出密码。
把 SecureString 转为加密字符串
通过 ConvertFrom-SecureString 命令,我们可以把一个 SecureString 对象转换成一个 Encrypted Standard String(加密后的一个字符串),然后保存到文件中。在创建 Credential 时直接使用前面保存的文件,从而避免明文密码在系统中出现。
$SecurePwd = ConvertTo-SecureString "123456" -AsPlainText -Force ConvertFrom-SecureString $SecurePwd
上图显示 ConvertFrom-SecureString 命令生成的加密字符串,我们把它保存到文本文件中:
ConvertFrom-SecureString $SecurePwd | Out-File "D:\pwd.txt"
看看内容:
好了,接下来就可以直接使用 pwd.txt 文件了。
一种看起来比较正常,也很安全的推荐用法:
复制代码 代码如下:Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString | Out-File "D:\pwd.txt"
执行这行命令,会要求你输入密码:
此处使用键盘输入代替了明文的密码字符串。
介绍了 ConvertFrom-SecureString 命令的用法后就可以介绍 ConvertTo-SecureString 命令的另外一个用法,把加密字符串转换成 SecureString 对象:
$f = "D:\pwd.txt" $SecurePwd = Get-Content $f | ConvertTo-SecureString $SecurePwd.Length
这次我们把 pwd.txt 文件中的内容通过 ConvertTo-SecureString 命令重新生成 SecureString 对象。最后通过 Length 属性检查了密码的长度。
下图概括了本文中主要术语和命令的关系:
应用密码的正确姿势
下面是在脚本中使用密码的建议做法:
# 生成并保存密码文件 Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString | Out-File "D:\pwd.txt" # 使用密码文件创建 Credential 信息 $f = "D:\pwd.txt" $Cred = New-Object -TypeName System.Management.Automation.PSCredential ` -ArgumentList UserName, (Get-Content $f | ConvertTo-SecureString)
这种用法也有不足之处,就是只能在生成 pwd.txt 文件的机器上使用这个文件。如果把它复制到其它的机器上,执行 Get-Content $f | ConvertTo-SecureString 时就会报错:
这是一种安全性限制,如果我们想在其它机器上使用 pwd.txt,就得了解些高级的用法!
高级玩法
ConvertTo-SecureString 和 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 生成并保存密码文件:
复制代码 代码如下:
Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString -key $key | Out-File "D:\pwd.txt"
使用密码文件创建和 Key 文件创建 Credential 信息:
$userName = "YourUserName" $passwdFile = "D:\pwd.txt" $keyFile = "D:\aes.key" $key = Get-Content $keyFile $Cred = New-Object -TypeName System.Management.Automation.PSCredential ` -ArgumentList $userName, (Get-Content $passwdFile | ConvertTo-SecureString -Key $key)
通过这种方法,把 pwd.txt 和 aes.key 文件拷贝到其它的机器上也是可以工作的。但是我们需要额外维护一个 key 文件的安全,这一般通过设置文件的访问权限就可以了。
总结
PowerShell 提供的安全选项使我们可以避免在脚本中直接使用明文的密码,把密码加密后保存在文件中的好处是可以通过文件的权限管理进行安全性控制。而使用 Key 选项则可以对上述用例进行扩展,从而支持更多的使用场景。但是带来的不便是我们需要另外维护一个机密的 Key 文件。从这点也可以看出,所谓的安全性其实是由安全机制和用户一起来保证的!无论多么安全的机制,在用户泄露了认证信息的情况下都是没有意义的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
RTX 5090要首发 性能要翻倍!三星展示GDDR7显存
三星在GTC上展示了专为下一代游戏GPU设计的GDDR7内存。
首次推出的GDDR7内存模块密度为16GB,每个模块容量为2GB。其速度预设为32 Gbps(PAM3),但也可以降至28 Gbps,以提高产量和初始阶段的整体性能和成本效益。
据三星表示,GDDR7内存的能效将提高20%,同时工作电压仅为1.1V,低于标准的1.2V。通过采用更新的封装材料和优化的电路设计,使得在高速运行时的发热量降低,GDDR7的热阻比GDDR6降低了70%。
更新日志
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]