2

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

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

    /* additional parameters */
}

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

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

4

5 回答 5

3

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

Read-Host–asSecureString带有参数的 cmdlet 。

此参数屏蔽输入。

于 2012-06-24T05:25:34.193 回答
1

您可以在此答案中找到一种使用计算机密码进行加密的方法(适用于安全机器)。

使用@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
于 2012-06-25T03:55:27.130 回答
1

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

理想情况下,您的 cmdlet 的实现会将 SecureString 传递给一些原生支持 SecureString(最安全)的 API;如果没有,您必须从 SecureString 中提取密码。这是一篇关于如何做到这一点的好文章:如何正确地将 SecureString 转换为字符串

于 2012-07-11T02:06:01.883 回答
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 */
}
于 2015-07-23T05:20:06.683 回答
0

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

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

甚至不用像这样的 webclient-object 编组......

$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 
于 2020-02-29T11:24:13.933 回答