如何在 PowerShell 中將安全字串轉換為明文
-
在 PowerShell 中使用
Marshal
類將安全字串轉換為明文 -
在 PowerShell 中使用
ConvertFrom-SecureString
cmdlet 將安全字串轉換為明文 -
在 PowerShell 中使用
NetworkCredential
類將安全字串轉換為明文 -
在 PowerShell 中使用
GetNetworkCredential
方法將安全字串轉換為明文 - 結論

PowerShell 提供了多種處理 SecureString
對象的方法,這些對象旨在保護內存中的敏感信息。然而,在某些情況下,儘管存在安全風險,但仍有必要將 SecureString
轉換為明文。
在本文中,我們探討了實現此轉換的不同方法,包括使用 Marshal
類、ConvertFrom-SecureString
cmdlet、NetworkCredential
類和 GetNetworkCredential()
方法。每種方法都有其優缺點和考慮因素,為在 PowerShell 腳本中安全處理敏感數據提供了靈活性。
在 PowerShell 中使用 Marshal
類將安全字串轉換為明文
在 PowerShell 中,[System.Runtime.InteropServices.Marshal]
類提供了與非管理代碼進行互操作和操作內存的方法。它的兩個方法 SecureStringToBSTR
和 PtrToStringAuto()
在將 SecureString
轉換為明文時起著關鍵作用。
示例:
$secureString = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
$secureStringPtr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureString)
$plainText = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($secureStringPtr)
$plainText
在此示例中,我們首先創建一個名為 $secureString
的 SecureString
對象,其中包含用 ConvertTo-SecureString
cmdlet 創建的密碼 "MyPassword"
。然後,我們使用 [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureString)
將 SecureString
轉換為 BSTR(基本字符串)表示。
最後,使用 [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($secureStringPtr)
將 BSTR 表示轉換為明文並存儲在 $plainText
變量中。
輸出:
在 PowerShell 中使用 ConvertFrom-SecureString
cmdlet 將安全字串轉換為明文
ConvertFrom-SecureString
cmdlet 將安全字符串轉換為加密標準字符串。從 PowerShell 7.0 開始,新增了一個參數 -AsPlainText
,將安全字符串轉換為明文字符串。
以下示例需要 PowerShell 版本 7.0 或更高版本。
示例:
$secureString = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
$plainText = ConvertFrom-SecureString -SecureString $secureString -AsPlainText
$plainText
在此示例中,我們首先創建一個名為 $secureString
的 SecureString
對象,其中包含用 ConvertTo-SecureString
cmdlet 創建的密碼 "MyPassword"
。然後,我們利用 ConvertFrom-SecureString
cmdlet 將 $secureString
轉換為其明文表示,並將結果存儲在 $plainText
變量中。
輸出:
在 PowerShell 中使用 NetworkCredential
類將安全字串轉換為明文
在 PowerShell 中,[System.Net.NetworkCredential]
類是 .NET
Framework 的 System.Net
命名空間的一部分。它主要用於提供網絡操作的憑證,例如訪問網絡服務、FTP 伺服器或網絡共享。
雖然它的主要目的是身份驗證,但在需要 plaintext
憑證的情況下,也可以用於將 SecureString
轉換為 plaintext
。
示例:
$secureString = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
$networkCredential = New-Object System.Net.NetworkCredential("", $secureString)
$plainText = $networkCredential.Password
$plainText
在此示例中,我們創建一個名為 $secureString
的 SecureString
對象,其中包含用 ConvertTo-SecureString
cmdlet 創建的密碼 "MyPassword"
。然後,我們實例化一個 System.Net.NetworkCredential
對象 $networkCredential
,提供一個空用戶名(因為我們的目的不需要)和包含密碼的 SecureString
作為參數。
最後,我們從 $networkCredential.Password
中檢索 plaintext
密碼並將其存儲在 $plainText
中。
輸出:
在 PowerShell 中使用 GetNetworkCredential
方法將安全字串轉換為明文
在 PowerShell 中,GetNetworkCredential()
方法是 PSCredential
類的一部分,該類用於表示一組用戶憑證。此方法主要用於提取存儲在 PSCredential
對象中的密碼的 plaintext
表示。
示例:
$secureString = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential("username", $secureString)
$plainText = $credential.GetNetworkCredential().Password
$plainText
在此示例中,我們首先創建一個名為 $secureString
的 SecureString
對象,其中包含用 ConvertTo-SecureString
cmdlet 創建的密碼 "MyPassword"
。接下來,我們創建一個名為 $credential
的 PSCredential
對象,使用一個虛擬用戶名和 $secureString
作為密碼。
最後,我們使用 $credential.GetNetworkCredential().Password
方法從 PSCredential
對象中提取 plaintext
密碼。
輸出:
結論
在 PowerShell 腳本中,將 SecureString
轉換為明文在各種情況下是一個常見需求。通過利用如 [System.Runtime.InteropServices.Marshal]
類、ConvertFrom-SecureString
cmdlet、[System.Net.NetworkCredential]
類或 GetNetworkCredential()
方法,使用者可以安全地處理敏感信息,同時滿足操作需求。
無論是與外部系統、舊版 API 還是網絡操作互動,這些方法都提供了靈活性和便利性。然而,對於敏感數據的處理,必須謹慎並考慮涉及的安全隱患。