防止暴露密码(GetNetworkCredential方法)

时间:2019-04-16 05:06:26

标签: c# powershell powershell-v4.0 azure-powershell powershell-remoting

我正在通过PowerShell运行空间在c#中执行PowerShell脚本。我们将凭证包装在凭证对象中。但是,当我们编写以下语句时,密码将公开。

$Credential = Get-Credential
$Password = $credential.GetNetworkCredential().Password

此处$ Password将具有纯文本形式的密码,我想防止用户编写任何旨在从凭据对象中检索密码的语句。

我可以想到的一种方法是,在执行脚本之前先扫描脚本文本,如果找到这样的语句,则报告。是否有更好的方法可以通过原生PowerShell 或任何其他方式来实现?

2 个答案:

答案 0 :(得分:1)

一旦PsCredentialGet-Credential cmdlet捕获:

$Credential = Get-Credential

$Credential变量具有两个属性:

  1. Username
  2. Password

Password属性的类型为SecureString

$Credential.Password.GetType()  --> SecureString

因此已加密。现在,我们可以使用这两个cmdlet将密码作为普通字符串传输/保存,而无需透露实际密码:

  1. ConvertFrom-SecureString
  2. ConvertTo-SecureString

假设我们在弹出myuser之后向提示符提供了mypassword用户名和Get-Credential密码。

下面的代码会将密码转换为加密的String对象:

$Credential.Password | ConverFrom-SecureString

#输出

 01000000d08c9ddf0115d1118c7a00c04fc297eb01000000f9ae07907bbc82458b25fd92b2dae62e0000000002000000000003660000c000000010000000e1d56e48520215b461e09a24c53375660000000004800000a0000000100000008eeb7cf1234bac1806b5b624f4dcef0a18000000c8062d946ab9605dfcaaba9a20d7a7486c54010451c2dd0714000000ce000956b190d080f2c5eae9e159a78916d88e98

您现在可以将此输出保存到文件中,并在以后用Get-Content读取,或将其保存到PowerShell变量中:

$EncryptedPassword = $Credential.Password | ConverFrom-SecureString

您可以使用`ConvertTo-SecureString将普通的String转换回SecureString

$Password = $EncryptedPassword | ConvertTo-SecureString

然后构造新的PsCredential对象:

$CredentialNew = New-Object System.Management.Automation.PsCredential('myuser', $Password)

我希望这就是你的追求。

答案 1 :(得分:0)

为了清楚起见:$credential.GetNetworkCredential().Password 仅在注册密码的帐户下有效。

关于这个问题,你也可以问:

"我如何防止用户写下他们的密码?" H4>

enter image description here

答案

不要使用密码(又名 SecureString 类),但验证用户基于(帐户)的机制,例如single sign on

引自SecureString shouldn't be used

<块引用>

处理凭证的一般方法是避免它们并且 而是依靠其他方式进行身份验证,例如证书或 Windows 身份验证。