假设我有一个自定义PowerShell Cmdlet,可以导出数据并使用密码对其进行加密。
[Cmdlet(VerbsData.Export, "SampleData")]
public class ExportSampleData : PSCmdlet
{
[Parameter(Mandatory = true)]
public string Password
{
get;
set;
}
/* additional parameters */
}
如何安全地妥善处理密码?例如,我想阻止管理员在控制台中输入值时显示该值。其他选项包括读取包含加密密码的文件。
我知道PSCredential但是这需要一个在这种情况下毫无意义的用户名。
答案 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