Зачем делать это при сохранении защищенной строки? - PullRequest
0 голосов
/ 17 декабря 2018

Может ли это каким-то образом сделать его более безопасным, чем просто безопасную строку и хранить ее в учетных данных?Зачем кому-то это делать?

$secVal = read-host  -AsSecureString -prompt "Enter xstoreuser password"
$strVal = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secVal)
$dasPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($strVal)

, а потом

psftp -l somelogin -pw $dasPassword -P 22 -b .\ftp.txt somehost

1 Ответ

0 голосов
/ 17 декабря 2018

Техника, которую вы показываете: , а не о создании команды больше безопасный - наоборот :

Вам необходимо проделать дополнительную работу, чтобы восстановить простой текстовый пароль из экземпляра [securestring], поскольку , чтобы передать пароль внешней внешней программе , например psftp.exe вам нужно небезопасное текстовое представление , поскольку внешние программы ничего не знают о безопасных строках .NET .

Насколько безопасенSecureString? рассказывает вам о безопасных строках .NET и их ограничениях в целом.


В качестве отступления: команда для извлечения пароля в виде простого текста может быть немного упрощена с помощью aux.[pscredential] экземпляр:

# Returns the plain-text content of secure string $secVal:
(New-Object pscredential somelogin, $secVal).GetNetworkCredential().Password

единственный безопасный подход заключается в во избежание использования простых текстовых паролей в целом и использование PKI вместо (на основе открытых и закрытых ключей) вместо этого, если поддерживается целевой программой.


К демонстрируют , что в виде простого текстаподход небезопасный (даже без использования промежуточной переменной для хранения незашифрованного пароля):

# Create a [pscredential] instance with a secure-string password:
# Note: To make this demo self-contained, I'm converting *from* plain
#       text in order to construct the credential object.
#       Note that you should never do that in production code.
#       The need to specify -Force to do it is a reminder that it
#       normally shouldn't be done.
$cred = New-Object pscredential someuser,
          (ConvertTo-SecureString -AsPlainText -Force 'actualPassword')

# Open a new hidden window that passes the password *as plain text* to 
# `cmd /c echo` (and then waits for a keypress, to keep the process alive).
$ps = Start-Process -PassThru -WindowStyle Hidden cmd "/c echo $($cred.GetNetworkCredential().Password) & pause"

# Now inspect the process' command line using CIM (WMI):
(Get-CimInstance Win32_Process -Filter "ProcessID = $($ps.ID)").CommandLine

# Kill (stop) the sample process.
$ps | Stop-Process

Выше приведено "C:\WINDOWS\system32\cmd.exe" /c echo actualPassword & pause, демонстрирующее, что обычный текстпароль действительно может быть получен другими процессами.

Вы также можете использовать методы GUI для проверки работающего процесса 'командная строка : диспетчер задач (Taskmgr.exe) илибез потенциального усечения SysInternals 'Process Explorer (procexp.exe) , который, однако, должен быть установлен по требованию - см. этот ответ ServerFault .

...