PowerShell 指令碼中的密碼

2021-09-22 09:14:20 字數 4105 閱讀 3241

筆者在《powershell 遠端執行任務》一文中提到了在指令碼中使用使用者名稱和密碼的基本方式:

$username ='***x'

$password ='yyyy'

$pass = convertto-securestring $password -asplaintext -force

$cred = new-object system.management.automation.pscredential -argumentlist $username,$pass

上面的**僅僅是能工作而已,因為在稍有安全性要求的環境中都不會允許明文密碼的出現。本文將介紹在 powershell 指令碼中如何以比較安全的方式使用密碼。

先來了解下面兩個概念:

securestring

encrypted standard string

securestring是 .net 中的乙個型別,它是為了解決安全性而設計出來的一種特殊的字串型別。比如你使用乙個密碼字串建立 securestring 物件,你無法通過這個物件還原出原來的密碼字串,但是卻可以把 securestring 物件當做密碼使用。

encrypted standard string是指經過加密後的乙個字串。

convertto-securestring命令可以通過明文的字串建立 securestring 物件:

$securepwd = convertto-securestring "

123456

" -asplaintext -force

然後再使用 $securepwd 建立 credential 等身份資訊。這種方式就是筆者在引言部分使用的方法,這是不安全的,因為任何能夠檢視指令碼的人都能從中找出密碼。

通過convertfrom-securestring命令,我們可以把乙個 securestring 物件轉換成乙個 encrypted standard string(加密後的乙個字串),然後儲存到檔案中。在建立 credential 時直接使用前面儲存的檔案,從而避免明文密碼在系統**現。

上圖顯示 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 物件:

這次我們把 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 指令碼中的密碼

筆者在 powershell 遠端執行任務 一文中提到了在指令碼中使用使用者名稱和密碼的基本方式 username x password yyyy pass convertto securestring password asplaintext force cred new object syste...

POWERSHELL指令碼執行許可權

powershell指令碼執行許可權 2009 02 04 16 55 02 分類 powershell 字型大小 訂閱 restricted 預設的設定,不允許任何script執行 allsigned 只能執行經過數字證書簽名的script unrestricted 允許所有的script執行 解...

PowerShell指令碼傳遞引數

在編寫powershell指令碼的時候,可以通過給變數賦值的方法輸出想要的結果,但這樣的話,需要改動指令碼內容。其實也可以在指令碼中定義引數,然後再在執行指令碼的時候對引數賦值,而無需改動指令碼內容。在powershell指令碼中,可以使用param 宣告引數,如下 param a,b write ...