使用密码securekey创建一个securestring

时间:2016-09-09 00:38:16

标签: powershell encryption

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字节密钥? (这样我就可以转到另一台机器并使用相同的密码解密安全字符串)

1 个答案:

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

的文件
  

Rfc2898DeriveBytes获取密码,salt和迭代计数,然后通过调用GetBytes方法生成密钥。
  RFC 2898包括用于从密码和salt创建密钥和初始化向量(IV)的方法。您可以使用基于密码的密钥派生函数PBKDF2来使用伪随机函数导出密钥,该函数允许生成几乎无限长度的密钥。 Rfc2898DeriveBytes类可用于从基本密钥和其他参数生成派生密钥。在基于密码的密钥派生函数中,基本密钥是密码,其他参数是salt值和迭代计数。