我现在使用的代码:
$password=Read-Host -Prompt "Enter password" -AsSecureString
因此,如果输入的密码少于16个字符,我如何填充安全字符串以确保输入的密码总共16个字符,而不转换回纯文本。
[编辑]
好吧,当我在一个使用AES加密的网上银行网站输入我的密码时,我注意到我的密码字符数在他们登录之前会增加到一定的数量,如特殊字符的数字所示' *'在密码字段中。所以,我怀疑在powershell中也可能有同样的过程。
[编辑]
事实证明,他们实际上并没有真正附加密码。他们只是用其他垃圾字符替换密码,以便在点击登录后立即从浏览器中删除密码。
[解决]
SecureString有一个内置方法AppendChar([Char] $char)
,它将$ char添加到securestring,如下所示:
$password.Appendchar('a') #adds 'a' to the securestring.
它首先对securestring进行解码并附加字符,但是一旦结果转换回securestring,它也会从内存中清除已解码的字符串。所以,使用AppendChar()
是安全的。
答案 0 :(得分:0)
<强> [解决] 强>
以下为SecureString类型提供的内置命令链简单地解决了上述要求:
$secureString=Read-Host -Prompt "Enter the string" -AsSecureString
$secureStringth.Appendchar('a') #appends character 'a' to the securestring.
通过使用我称为Decode-SecureString.ps1
的自定义构建cmdlet以纯文本显示字符来确认:
param([SecureString]$SecureString)
Write-Information -MessageData "Retrieving string..." -Verbose -InformationAction Continue
try{
$bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureString)
$length = [Runtime.InteropServices.Marshal]::ReadInt32($bstr, -4)
[Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)
}
finally{
if ( $bstr -ne [IntPtr]::Zero ) {
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
}
}
示例:
$secureString=Read-Host -Prompt "Enter the string" -AsSecureString
Enter the string: *********
.\decode-securestring.ps1 -securestring $secureString
Retrieving string...
123456789
$secureString.Appendchar('a')
.\decode-securestring.ps1 -securestring $secureString
Retrieving string...
123456789a
正如我们所看到的,安全字符串用字符填充。我们可以根据需要填充更多的字符。
答案 1 :(得分:-1)
最好只在循环中检查密码的长度:
do {
$password = [string](Read-Host -Prompt 'Enter a password ( atleast 16 digits ) ' -AsSecureString)
if ($password.Length -le 16) {
Write-Host "not enough characters"
continue
}
break
} while ($true)
填写密码不是一个好主意。