让我们来看看一种在计算机上加密文本的安全方法。以下的 Protect-Text
函数接受任意文本,并自动加密,不需要密码。它不使用密码,而是使用您的用户帐户和机器,或者只使用您的机器作为密钥。
如果使用 -Scope LocalMachine
,任何使用该机器的人都可以解密该文本,但如果该文本泄露给其他人,它无法在其它机器上解密。如果您使用 -Scope CurrentUser
,只有加密者可以解密,并且只能在加密的机器上解密。这个加密方案很适合保存您的私人密码。
此外,为了提高安全性,可以在顶部添加(可选)密码。当指定了密码时,将应用上述相同的限制,但此外还需要知道密码才能解密文本。
请注意您也可以控制文本解码。请确保加密和解密使用相同的编码。
以下是加密函数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| function Protect-Text { [CmdletBinding()] param ( [Parameter(Mandatory=$true,ValueFromPipeline=$true)] [String] $SecretText,
[string] $Password='',
[string] [ValidateSet('CurrentUser','LocalMachine')] $scope = 'CurrentUser',
[string] [ValidateSet('UTF7','UTF8','UTF32','Unicode','ASCII','Default')] $Encoding = 'Default',
[Switch] $ReturnByteArray
) begin { Add-Type -AssemblyName System.Security if ([string]::IsNullOrEmpty($Password)) { $optionalEntropy = $null } else { $optionalEntropy = [System.Text.Encoding]::$Encoding.GetBytes($Password) } } process { try { $userData = [System.Text.Encoding]::$Encoding.GetBytes($SecretText) $bytes = [System.Security.Cryptography.ProtectedData]::Protect($userData, $optionalEntropy, $scope) if ($ReturnByteArray) { $bytes } else { [Convert]::ToBase64String($bytes) } } catch { throw "Protect-Text: Unable to protect text. $_" } }
|
结果类似这样:
1 2 3 4
| PS> Protect-Text -SecretText 'I am encrypted' -scope LocalMachine AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAF8Hpm9A5A0upZysoxLlvgwQAAAACAAAAAAAQZgAAAAEAACAAAACbOsUoDuZJXNkWIzfAABxktVg+Txn7A8Rz SCvFP7I9YQAAAAAOgAAAAAIAACAAAABz7G7Tpuoje9meLOuugzx1WSoOUfaBtGPM/XZHytjC8hAAAAApt/TDhJ9EqeWEPLIDkd4bQAAAAAN0Q503Pa7X MxIMOnaO7qd3LKXJa4qhht+jc+Z0HaaV5/md83ipP1vefYAAUXdj8qv4eREeCBSGMqvKjbaOsOg=
|
如果您想了解如何将 Base64 编码的文本转换回原始文本,请看我们的下一个技能!