如何在 PowerShell 中將安全字串轉換為明文
-
在 PowerShell 中使用
Marshal類將安全字串轉換為明文 -
在 PowerShell 中使用
ConvertFrom-SecureStringcmdlet 將安全字串轉換為明文 -
在 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 還是網絡操作互動,這些方法都提供了靈活性和便利性。然而,對於敏感數據的處理,必須謹慎並考慮涉及的安全隱患。
