ConvertTo-SecureString без -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)

Однако существует очень мало (/none) указаний о том, как преобразовать обычную строку в защищенную строку без параметров -AsPlainText -Force. (Я понимаю последствия для безопасности обычных строк)

Как я могу добиться вышеизложенного безопасно/не раздражая PSScriptAnalyzer (я не собираюсь подавлять сообщение)


person Michael B    schedule 04.10.2016    source источник
comment
Связано.   -  person Ansgar Wiechers    schedule 04.10.2016


Ответы (1)


Я не могу точно сказать, о чем вы спрашиваете, но я дам ответы на различные интерпретации, которые у меня есть на ваш вопрос.

«Как я могу сгенерировать пароль для PSCredential без ConvertTo-SecureString?»

Вы можете передать обычную строку непосредственно конструктору, и он внутренне преобразует ее в SecureString.

$password = [System.Web.Security.Membership]::GeneratePassword(128,0)
$configCredential = New-Object PSCredential ($username, $password)

Однако наилучшая практика при использовании значений SecureString заключается в том, чтобы никогда не использовать секретное значение в открытом тексте. Причина, по которой вы должны указать -Force с -AsPlainText, и, возможно, также причина существования правила PSScriptAnalyzer, состоит в том, чтобы препятствовать этой практике. . Если вы полагаетесь на безопасность SecureString для смягчения угроз, вы должны следовать этому мягкому принуждению, избегая открытой переменной $password:

$configCredential = New-Object PSCredential ($username, [System.Web.Security.Membership]::GeneratePassword(128,0))

«Как я могу преобразовать строку в безопасную строку, не отключая и не подавляя ошибки PSScriptAnalyzer?»

Если вас не интересует сам объект учетных данных, но вы хотите получить SecureString без использования ConvertTo-SecureString, вы все равно можете (ab) использовать для этой цели класс PSCredential. Более легкий для чтения пример:

$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)
}
person Micah R Ledbetter    schedule 22.08.2017