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
),或者,在没有潜在截断的情况下,必须按需安装任务管理器-请参阅。相关:相关: