引言

笔者在《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 "" -AsPlainText -Force

然后再使用 $SecurePwd 创建 Credential 等身份信息。这种方式就是笔者在引言部分使用的方法,这是不安全的,因为任何能够查看脚本的人都能从中找出密码。

把 SecureString 转为加密字符串

通过 ConvertFrom-SecureString 命令,我们可以把一个 SecureString 对象转换成一个 Encrypted Standard String(加密后的一个字符串),然后保存到文件中。在创建 Credential 时直接使用前面保存的文件,从而避免明文密码在系统中出现。

$SecurePwd = ConvertTo-SecureString "" -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 文件。从这点也可以看出,所谓的安全性其实是由安全机制和用户一起来保证的!无论多么安全的机制,在用户泄露了认证信息的情况下都是没有意义的。

PowerShell 脚本中的密码的更多相关文章

  1. 在PowerShell脚本中集成Microsoft Graph

    作者:陈希章 发表于2017年4月23日 我旗帜鲜明地表态,我很喜欢PowerShell,相比较于此前的Cmd Shell,它有一些重大的创新,例如基于.NET的类型系统,以及管道.模块的概念等等.那 ...

  2. 技术分享:如何在PowerShell脚本中嵌入EXE文件

    技术分享:如何在PowerShell脚本中嵌入EXE文件 我在尝试解决一个问题,即在客户端攻击中只使用纯 PowerShell 脚本作为攻击负荷.使用 PowerShell 运行恶意代码具有很多优点, ...

  3. 今天在写powershell脚本中犯的两个错误

    可能是因为牙痛没睡好,今天老是犯错,还是脚本写错,特别难调. 第一个错误: powershell脚本里面,函数与函数互相调用的传参.其实就像调用普通的cmdlet一样的写法,应该这么写: Add-Sc ...

  4. PowerShell 脚本中调用密文密码

    1. 把密码转变为加密的字符串.使用命令 ConvertFrom-SecureString Read-Host "Enter Password" -AsSecureString | ...

  5. 【Azure Developer】调用SDK的runPowerShellScript方法,在Azure VM中执行PowerShell脚本示例

    当需要通过代码的方式执行PowerShell脚本时,可以参考以下的示例. Azure SDK中提供了两个方法来执行PowerShell脚本 (SDK Source Code: https://gith ...

  6. PowerShell脚本传递参数

    在编写PowerShell脚本的时候,可以通过给变量赋值的方法输出想要的结果,但这样的话,需要改动脚本内容.其实也可以在脚本中定义参数,然后再在执行脚本的时候对参数赋值,而无需改动脚本内容. 在Pow ...

  7. Qtp测试中的密码问题

    Qtp中,一般录制的脚本进行回放的时候就会遇到各种各样的问题,导致回放不能顺利进行,比如这次我在录制一个简单的登陆脚本的时候,就遇到了这样的问题: [遇到问题] 1,  录制好的脚本中的密码不能正常输 ...

  8. 在脚本中使用sudo命令,将密码保存在脚本中,不需要手动输入密码

    在脚本中使用sudo命令,将密码保存在脚本中,不需要手动输入密码. #!/bin/bash echo 'xxx密码xxx'|sudo -S service mysql start echo 'xxx密 ...

  9. 如何在windows计划中调用备份sharepoint2010网站集的powershell脚本

    最近有个项目需要在在windows计划中使用powershell脚本备份sharepoint2010网站集,打开sharepoint的powershell执行命令管理界面的属性 查看: C:\Wind ...

随机推荐

  1. 几个常用的linux命令(操作服务器时会用到)

    目录 tmux 背景 安装 使用 启动一个tmux session 暂时离开当前session 回到之前的session 重命名session 创建window 创建pane ps scp 参考 tm ...

  2. 【基础】Asp.Net操作Cookie总结

    一.什么是Cookie? Cookie是存储在客户端文件系统的文本文件或客户端浏览器对话的内存中的少量数据.它主要用来跟踪数据设置,例如:当我们要访问一个网站网页的时候,用户请求网页时,应用程序可能会 ...

  3. 关于Javascript循环体变量声明与初始化的效率问题

    针对循环体变量声明与初始化的效率问题,将执行的简单测试代码如下: function test(n) { console.time('Internally initialized'); for (var ...

  4. Ionic在Android上部署app步骤

    详情链接:http://www.ncloud.hk/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/ionic%E5%9C%A8android%E4%B8%8A%E9%83% ...

  5. Angular中使用Swiper不能滑动的解决方法

    Swiper是目前较为流行的移动端触摸滑动插件,因为其简单好用易上手,很受很多设计师的欢迎. 今天在使用Swiper的时候遇到这个问题: 使用angularjs动态循环生成swiper-slide类, ...

  6. Swift三元条件运算

    三元条件运算的特殊在于它是有三个操作数的运算符,它的原型是问题?答案1:答案2.它简洁地表达根据问题成立与否作出二选一的操作.如果问题成立,返回答案1的结果; 如果不成立,返回答案2的结果. 使用三元 ...

  7. [leetcode-572-Subtree of Another Tree]

    Given two non-empty binary trees s and t, check whether tree t hasexactly the same structure and nod ...

  8. 不错的 HttpHelper类 c#

    /// <summary>/// 类说明:HttpHelper类,用来实现Http访问,Post或者Get方式的,直接访问,带Cookie的,带证书的等方式,可以设置代理/// 重要提示: ...

  9. ArcGIS API for JavaScript 4.4学习笔记[新] AJS4.4和AJS3.21新特性

    ESRI官网悄无声息突然更新4.4和3.21,公众号也没有什么消息.照例,给大家看看这次更新有什么新特性吧. 1. AJS 4.4 官方更新日志:点我,比较详细.我在这里抽一些主干作为说明. 1.1 ...

  10. Vijos 1010 清帝之惑之乾隆

    背景 乾隆,雍正的第四子,在位60年,退位后又当了三年太上皇,终年89岁. 乾隆即位之初,实行宽猛互济的政策,务实足国,重视农桑,停止捐纳,平定叛乱等一系列活动中,充分体现了他的文治武功,乾隆帝向慕风 ...