ConvertTo-SecureString的语法是 -
ConvertTo-SecureString [-String] [[-SecureKey]]
我想用它来创建一个基于用户密码而不是DPAPI的安全字符串。
我可以使用以下代码
创建一个安全密钥$key = New-Object byte[](32)
$rng = [System.Security.Cryptography.RNGCryptoServiceProvider]::Create()
$rng.GetBytes($key)
但是根据文档
有效密钥长度为16,24和32字节
因此很难只输入一个密码(适合该大小)
如何将“correcthorsebatterystaple”转换为32字节密钥? (这样我就可以转到另一台机器并使用相同的密码解密安全字符串)
答案 0 :(得分:2)
所以看起来这很有效!
$salt = "Page-Yet-Rock-Food-Also-Fear-Blind-Rub-Letter-4" # courtesy of correcthorsebatterystaple.net
$iterations = 1000
$plaintext = ConvertTo-Json -InputObject $ObjectToEncrypt
$saltBytes = [Text.Encoding]::Unicode.GetBytes($salt)
$password = "Bedroom-Woman-Spoon-Quarrel-7"
$deriveBytes = new-Object Security.Cryptography.Rfc2898DeriveBytes($password,$saltBytes ,$iterations)
$key = $deriveBytes.GetBytes(32)
$SecureString = ConvertTo-SecureString -String $StringToDecrypt -Key $key
的文件
Rfc2898DeriveBytes获取密码,salt和迭代计数,然后通过调用GetBytes方法生成密钥。
RFC 2898包括用于从密码和salt创建密钥和初始化向量(IV)的方法。您可以使用基于密码的密钥派生函数PBKDF2来使用伪随机函数导出密钥,该函数允许生成几乎无限长度的密钥。 Rfc2898DeriveBytes类可用于从基本密钥和其他参数生成派生密钥。在基于密码的密钥派生函数中,基本密钥是密码,其他参数是salt值和迭代计数。