不带 -AsPlainText -Force 的 ConvertTo-SecureString
ConvertTo-SecureString without -AsPlainText -Force
PSScriptAnalyzer 有 PSAvoidUsingConvertToSecureStringWithPlainText 警告。这意味着使用以下代码将失败。
$password = [System.Web.Security.Membership]::GeneratePassword(128,0)
$securePassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$configCredential = New-Object System.Management.Automation.PSCredential ($username,$securePassword)
但是,关于如何在不使用 -AsPlainText -Force 选项的情况下将常规字符串转换为安全字符串的指南很少 (/none)。 (我确实了解常规字符串的安全隐患)
我怎样才能安全地实现上述目标/不惹恼 PSScriptAnalyzer(我不想隐藏消息)
我不太清楚你在问什么,但我会根据我对你问题的不同解释给出答案。
"How can I generate a password for a PSCredential without ConvertTo-SecureString?"
您可以将常规字符串直接传递给构造函数,它会在内部将其转换为 SecureString。
$password = [System.Web.Security.Membership]::GeneratePassword(128,0)
$configCredential = New-Object PSCredential ($username, $password)
但是,使用 SecureString 值时的最佳做法是永远不要首先使用明文形式的秘密值 - 这是您必须使用 -AsPlainText
指定 -Force
的原因,也可能是为什么PSScriptAnalyzer 规则的存在首先是为了阻止这种做法。如果您依靠 SecureString 的安全性来缓解威胁,您应该通过避免明文 $password
变量来遵循这种温和的强制:
$configCredential = New-Object PSCredential ($username, [System.Web.Security.Membership]::GeneratePassword(128,0))
"How can I convert a string to a secure string without tripping or suppressing PSScriptAnalyzer errors?"
如果您不关心凭据对象本身,但想要一个不使用 ConvertTo-SecureString
的 SecureString,您仍然可以(滥用)使用 PSCredential class 来达到此目的。一个更容易阅读的例子:
$password = [System.Web.Security.Membership]::GeneratePassword(128,0)
$configCredential = New-Object PSCredential ($username, $password)
$securePassword = $configCredential.Password
遵循最佳实践的一行代码:
$securePassword = New-Object PSCredential ($username, [System.Web.Security.Membership]::GeneratePassword(128,0)) | Select-Object -ExpandProperty Password
你也可以将一个字符串分割成字符,然后一个一个地追加到一个 SecureString 中:
$securePassword = New-Object SecureString
foreach ($char in [System.Web.Security.Membership]::GeneratePassword(128,0).ToCharArray()) {
$securePassword.AppendChar($char)
}
PSScriptAnalyzer 有 PSAvoidUsingConvertToSecureStringWithPlainText 警告。这意味着使用以下代码将失败。
$password = [System.Web.Security.Membership]::GeneratePassword(128,0)
$securePassword = ConvertTo-SecureString -String $password -AsPlainText -Force
$configCredential = New-Object System.Management.Automation.PSCredential ($username,$securePassword)
但是,关于如何在不使用 -AsPlainText -Force 选项的情况下将常规字符串转换为安全字符串的指南很少 (/none)。 (我确实了解常规字符串的安全隐患)
我怎样才能安全地实现上述目标/不惹恼 PSScriptAnalyzer(我不想隐藏消息)
我不太清楚你在问什么,但我会根据我对你问题的不同解释给出答案。
"How can I generate a password for a PSCredential without ConvertTo-SecureString?"
您可以将常规字符串直接传递给构造函数,它会在内部将其转换为 SecureString。
$password = [System.Web.Security.Membership]::GeneratePassword(128,0)
$configCredential = New-Object PSCredential ($username, $password)
但是,使用 SecureString 值时的最佳做法是永远不要首先使用明文形式的秘密值 - 这是您必须使用 -AsPlainText
指定 -Force
的原因,也可能是为什么PSScriptAnalyzer 规则的存在首先是为了阻止这种做法。如果您依靠 SecureString 的安全性来缓解威胁,您应该通过避免明文 $password
变量来遵循这种温和的强制:
$configCredential = New-Object PSCredential ($username, [System.Web.Security.Membership]::GeneratePassword(128,0))
"How can I convert a string to a secure string without tripping or suppressing PSScriptAnalyzer errors?"
如果您不关心凭据对象本身,但想要一个不使用 ConvertTo-SecureString
的 SecureString,您仍然可以(滥用)使用 PSCredential class 来达到此目的。一个更容易阅读的例子:
$password = [System.Web.Security.Membership]::GeneratePassword(128,0)
$configCredential = New-Object PSCredential ($username, $password)
$securePassword = $configCredential.Password
遵循最佳实践的一行代码:
$securePassword = New-Object PSCredential ($username, [System.Web.Security.Membership]::GeneratePassword(128,0)) | Select-Object -ExpandProperty Password
你也可以将一个字符串分割成字符,然后一个一个地追加到一个 SecureString 中:
$securePassword = New-Object SecureString
foreach ($char in [System.Web.Security.Membership]::GeneratePassword(128,0).ToCharArray()) {
$securePassword.AppendChar($char)
}