PowerShell 腳本中的密碼保存的方法
引言
筆者在《PowerShell 遠(yuǎn)程執(zhí)行任務(wù)》一文中提到了在腳本中使用用戶名和密碼的基本方式:
$Username = 'xxxx' $Password = 'yyyy' $Pass = ConvertTo-SecureString $Password -AsPlainText -Force $Cred = New-Object System.Management.Automation.PSCredential -ArgumentList $Username,$Pass
上面的代碼僅僅是能工作而已,因?yàn)樵谏杂邪踩砸蟮沫h(huán)境中都不會(huì)允許明文密碼的出現(xiàn)。本文將介紹在 PowerShell 腳本中如何以比較安全的方式使用密碼。
把密碼轉(zhuǎn)為 SecureString
先來(lái)了解下面兩個(gè)概念:
SecureString Encrypted Standard String
SecureString 是 .net 中的一個(gè)類型,它是為了解決安全性而設(shè)計(jì)出來(lái)的一種特殊的字符串類型。比如你使用一個(gè)密碼字符串創(chuàng)建 SecureString 對(duì)象,你無(wú)法通過這個(gè)對(duì)象還原出原來(lái)的密碼字符串,但是卻可以把 SecureString 對(duì)象當(dāng)做密碼使用。
Encrypted Standard String 是指經(jīng)過加密后的一個(gè)字符串。
ConvertTo-SecureString 命令可以通過明文的字符串創(chuàng)建 SecureString 對(duì)象:
$SecurePwd = ConvertTo-SecureString "123456" -AsPlainText -Force
然后再使用 $SecurePwd 創(chuàng)建 Credential 等身份信息。這種方式就是筆者在引言部分使用的方法,這是不安全的,因?yàn)槿魏文軌虿榭茨_本的人都能從中找出密碼。
把 SecureString 轉(zhuǎn)為加密字符串
通過 ConvertFrom-SecureString 命令,我們可以把一個(gè) SecureString 對(duì)象轉(zhuǎn)換成一個(gè) Encrypted Standard String(加密后的一個(gè)字符串),然后保存到文件中。在創(chuàng)建 Credential 時(shí)直接使用前面保存的文件,從而避免明文密碼在系統(tǒng)中出現(xiàn)。
$SecurePwd = ConvertTo-SecureString "123456" -AsPlainText -Force ConvertFrom-SecureString $SecurePwd

上圖顯示 ConvertFrom-SecureString 命令生成的加密字符串,我們把它保存到文本文件中:
ConvertFrom-SecureString $SecurePwd | Out-File "D:\pwd.txt"
看看內(nèi)容:

好了,接下來(lái)就可以直接使用 pwd.txt 文件了。
一種看起來(lái)比較正常,也很安全的推薦用法:
執(zhí)行這行命令,會(huì)要求你輸入密碼:

此處使用鍵盤輸入代替了明文的密碼字符串。
介紹了 ConvertFrom-SecureString 命令的用法后就可以介紹 ConvertTo-SecureString 命令的另外一個(gè)用法,把加密字符串轉(zhuǎn)換成 SecureString 對(duì)象:
$f = "D:\pwd.txt" $SecurePwd = Get-Content $f | ConvertTo-SecureString $SecurePwd.Length

這次我們把 pwd.txt 文件中的內(nèi)容通過 ConvertTo-SecureString 命令重新生成 SecureString 對(duì)象。最后通過 Length 屬性檢查了密碼的長(zhǎng)度。
下圖概括了本文中主要術(shù)語(yǔ)和命令的關(guān)系:

應(yīng)用密碼的正確姿勢(shì)
下面是在腳本中使用密碼的建議做法:
# 生成并保存密碼文件
Read-Host "Enter Password" -AsSecureString | ConvertFrom-SecureString | Out-File "D:\pwd.txt"
# 使用密碼文件創(chuàng)建 Credential 信息
$f = "D:\pwd.txt"
$Cred = New-Object -TypeName System.Management.Automation.PSCredential `
-ArgumentList UserName, (Get-Content $f | ConvertTo-SecureString)
這種用法也有不足之處,就是只能在生成 pwd.txt 文件的機(jī)器上使用這個(gè)文件。如果把它復(fù)制到其它的機(jī)器上,執(zhí)行 Get-Content $f | ConvertTo-SecureString 時(shí)就會(huì)報(bào)錯(cuò):

這是一種安全性限制,如果我們想在其它機(jī)器上使用 pwd.txt,就得了解些高級(jí)的用法!
高級(jí)玩法
ConvertTo-SecureString 和 ConvertFrom-SecureString 命令都支持選項(xiàng) -Key。在處理密碼時(shí)通過使用 Key 選項(xiàng)可以提供額外的安全性,并且允許在不同的環(huán)境中使用密碼文件。
先生成 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"
使用密碼文件創(chuàng)建和 Key 文件創(chuàng)建 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 文件拷貝到其它的機(jī)器上也是可以工作的。但是我們需要額外維護(hù)一個(gè) key 文件的安全,這一般通過設(shè)置文件的訪問權(quán)限就可以了。
總結(jié)
PowerShell 提供的安全選項(xiàng)使我們可以避免在腳本中直接使用明文的密碼,把密碼加密后保存在文件中的好處是可以通過文件的權(quán)限管理進(jìn)行安全性控制。而使用 Key 選項(xiàng)則可以對(duì)上述用例進(jìn)行擴(kuò)展,從而支持更多的使用場(chǎng)景。但是帶來(lái)的不便是我們需要另外維護(hù)一個(gè)機(jī)密的 Key 文件。從這點(diǎn)也可以看出,所謂的安全性其實(shí)是由安全機(jī)制和用戶一起來(lái)保證的!無(wú)論多么安全的機(jī)制,在用戶泄露了認(rèn)證信息的情況下都是沒有意義的。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Powershell 腳本數(shù)字簽名實(shí)現(xiàn)方法
這篇文章主要介紹了Powershell 腳本數(shù)字簽名實(shí)現(xiàn)方法,需要的朋友可以參考下2017-10-10
PowerShell函數(shù)中限制數(shù)組參數(shù)個(gè)數(shù)的例子
這篇文章主要介紹了PowerShell中限制函數(shù)的數(shù)組參數(shù)個(gè)數(shù)的例子,可以控制數(shù)組的參數(shù)個(gè)數(shù)在指定范圍內(nèi),需要的朋友可以參考下2014-07-07
PowerShell ISE中代碼轉(zhuǎn)換大小寫的技巧
這篇文章主要介紹了PowerShell ISE中代碼轉(zhuǎn)換大小寫的技巧,本文使用ISE內(nèi)置快捷鍵解決這個(gè)問題,需要的朋友可以參考下2015-03-03
PowerShell中定義哈希散列(Hash)和調(diào)用例子
這篇文章主要介紹了PowerShell中定義哈希散列(Hash)和調(diào)用例子,本文介紹在PowerShell中如何創(chuàng)建一個(gè)哈希變量,并且使用哈希變量,需要的朋友可以參考下2014-08-08
PowerShell移動(dòng)目錄中指定文件的方法(非全部文件)
這篇文章主要介紹了PowerShell移動(dòng)目錄中指定文件的方法,注意,本文講解的并非移動(dòng)全部文件,而是根據(jù)需求查詢出的指定文件,需要的朋友可以參考下2014-08-08
PowerShell小技巧之讀取Windows產(chǎn)品密鑰
這篇文章主要給大家分享一段使用PowerShell讀取Windows產(chǎn)品密鑰的小技巧,非常的簡(jiǎn)單實(shí)用,有需要的朋友可以參考下。2014-10-10

