Powershell Padding SecureString输入

时间:2018-02-16 03:56:21

标签: powershell

我现在使用的代码:

$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()是安全的。

2 个答案:

答案 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)

填写密码不是一个好主意。