Powershell 为什么在存储安全字符串时会这样做?

Powershell 为什么在存储安全字符串时会这样做?,powershell,credentials,Powershell,Credentials,在某种程度上,这会使它比仅仅是一个安全字符串并将其存储在凭证中更安全吗?为什么会有人这样做 $secVal = read-host -AsSecureString -prompt "Enter xstoreuser password" $strVal = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secVal) $dasPassword = [System.Runtime.InteropServices.Mars

在某种程度上,这会使它比仅仅是一个安全字符串并将其存储在凭证中更安全吗?为什么会有人这样做

$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

您展示的技术并不是让命令更安全-相反

您需要做额外的工作来从
[securestring]
实例恢复纯文本密码,因为为了将密码传递给外部程序,例如
psftp.exe
,您需要不安全的纯文本表示,因为外部程序对.NET安全字符串一无所知

介绍.NET安全字符串及其一般限制


另一方面:提取纯文本密码的命令可以通过aux稍微简化<代码>[pscredential]实例:

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

唯一的安全方法是完全避免使用纯文本密码如果目标程序支持,则使用方法(基于公钥和私钥)


证明纯文本方法是不安全的(即使不使用中间变量来存储未加密的密码):

上面给出了
“C:\WINDOWS\system32\cmd.exe”/C echo actualPassword&pause
,表明纯文本密码确实可以通过其他进程获得


您还可以使用GUI方法检查正在运行的进程的命令行:任务管理器(
Taskmgr.exe
),或者,在没有潜在截断的情况下,必须根据需要进行安装-请参阅。

您展示的技术并不是为了使命令更安全-相反

您需要做额外的工作来从
[securestring]
实例恢复纯文本密码,因为为了将密码传递给外部程序,例如
psftp.exe
,您需要不安全的纯文本表示,因为外部程序对.NET安全字符串一无所知

介绍.NET安全字符串及其一般限制


另一方面:提取纯文本密码的命令可以通过aux稍微简化<代码>[pscredential]实例:

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

唯一的安全方法是完全避免使用纯文本密码如果目标程序支持,则使用方法(基于公钥和私钥)


证明纯文本方法是不安全的(即使不使用中间变量来存储未加密的密码):

上面给出了
“C:\WINDOWS\system32\cmd.exe”/C echo actualPassword&pause
,表明纯文本密码确实可以通过其他进程获得

您还可以使用GUI方法检查正在运行的进程的命令行:任务管理器(
Taskmgr.exe
),或者,在没有潜在截断的情况下,必须按需安装任务管理器-请参阅。

相关:相关: