如何在自定义编写的PowerShell cmdlet中安全地处理密码?

时间:2012-06-24 01:51:12

标签: c#-4.0 powershell cmdlets

假设我有一个自定义PowerShell Cmdlet,可以导出数据并使用密码对其进行加密。

[Cmdlet(VerbsData.Export, "SampleData")]
public class ExportSampleData : PSCmdlet
{
    [Parameter(Mandatory = true)]
    public string Password
    {
        get;
        set;
    }

    /* additional parameters */
}

如何安全地妥善处理密码?例如,我想阻止管理员在控制台中输入值时显示该值。其他选项包括读取包含加密密码的文件。

我知道PSCredential但是这需要一个在这种情况下毫无意义的用户名。

5 个答案:

答案 0 :(得分:3)

如果您只想获取密码,可以使用

带有Read-Host参数的

–asSecureString cmdlet。

此参数屏蔽输入。

答案 1 :(得分:1)

您可以在this answer中找到隐藏计算机密码的方法(适用于安全机器)。

使用@Christian响应,您可以将密码放入磁盘:

PS > $cred.Password | ConvertFrom-SecureString | Set-Content c:\temp\password.txt

用以下方式进行检索:

$password = Get-Content c:\temp\password.txt | ConvertTo-SecureString
$cred = New-Object System.Management.Automation.PsCredential "UserName",$password

答案 2 :(得分:1)

将Password参数的类型更改为SecureString;如果管理员省略-Password参数,PowerShell将通过提示管理员输入必需参数并在键入时显示astrisks来做正确的事。

理想情况下,cmdlet的实现会将SecureString传递给本机支持SecureString的某些API(最安全);如果没有,您将不得不从SecureString中提取密码。这是一篇关于如何做到这一点的好文章:How to properly convert SecureString to String

答案 3 :(得分:1)

如果您正在编写C#PowerShell Cmdlet并且其中一个参数要求用户输入密码,则应对其进行模糊处理。

要执行此操作,您需要using System.Security;

然后您的参数类型应为SecureString

所以使用你的例子:

[Cmdlet(VerbsData.Export, "SampleData")]
public class ExportSampleData : PSCmdlet
{
    [Parameter(Mandatory = true)]
    public SecureString Password
    {
        get;
        set;
    }

/* additional parameters */
}

答案 4 :(得分:0)

SecureString-Handling使您感觉更加安全,即使事实并非如此。您可以像这样轻松加密任何SecureString ...

$mrsh = [System.Runtime.InteropServices.Marshal]
$ptr  = $mrsh::SecureStringToBSTR($secureString)
$pass = $mrsh::PtrToStringAuto($ptr)

甚至没有像这样的webclient对象一起编组...

$cred = Get-Credential
$web = [Net.WebClient]::new()
$web.Credentials = [System.Net.NetworkCredential]::new($cred.UserName,$cred.Password)
$pass = $web.Credentials.Password 

因此,总而言之,密码和SecureString-Password均不应永久存储为文件或其他任何形式。创造生命 此信息的信息越短越好-例如从输入密码到清除密码变量及其所有继承的变量,如下所示:

Remove-Variable pass, cred, web -ea 0