2012-04-16 101 views
3

我正在使用gnupg通过powershell脚本加密和解密数据,问题是,我在密码中的代码。这可能不是最好的解决方案。哪种方法可以为脚本提供密码?谢谢。gpg与powershell - 密码安全

C:\"Program Files"\GNU\GnuPG\gpg2.exe --passphrase mypassphrase --batch --output C:\Z\$decrypted_file.xls --decrypt C:\_Zo\$encrypted_file 

回答

4

您可以在磁盘上加密密码或密码。

以下解决方案使用计算机作为用户

以下两个脚本是securot框架.NET程序集。

对于服务器计算机,可以通过计算机身份保护秘密。此代码使用的事实是任何可以在计算机上运行代码的人都可以访问该密码。所以passwword文件可以在网络上共享,只能由服务器本身解码。您可以将ACL添加到密码文件中,以使其仅由某组用户读取。

Crypting(必须在服务器计算机上完成):

# Mandatory Framework .NET Assembly 
Add-Type -assembly System.Security 

# String to Crypt 
$passwordASCII = Read-Host -Prompt "Entrer le mot de passe" 

# String to INT Array 
$enc = [system.text.encoding]::Unicode 
$clearPWD_ByteArray = $enc.GetBytes($passwordASCII.tochararray()) 

# Crypting 
$secLevel = [System.Security.Cryptography.DataProtectionScope]::LocalMachine 
$bakCryptedPWD_ByteArray = [System.Security.Cryptography.ProtectedData]::Protect($clearPWD_ByteArray, $null, $secLevel) 

# Store in Base 64 form 
$B64PWD_ByteArray = [Convert]::ToBase64String($bakCryptedPWD_ByteArray) 
Set-Content -LiteralPath c:\Temp\pass.txt -Value $B64PWD_ByteArray 

解码:

# Mandatory Framework .NET Assembly 
Add-Type -assembly System.Security 

# Getting from Base 64 storage 
$resCryptedPWD_ByteArray = [Convert]::FromBase64String((Get-Content -LiteralPath c:\Temp\pass.txt)) 

# Decoding 
$secLevel = [System.Security.Cryptography.DataProtectionScope]::LocalMachine 
$clearPWD_ByteArray = [System.Security.Cryptography.ProtectedData]::Unprotect($resCryptedPWD_ByteArray, $null, $secLevel) 

# Dtring from int Array 
$enc = [system.text.encoding]::Unicode 
$enc.GetString($clearPWD_ByteArray) 
+0

谢谢你,JPBlanc。如果我理解正确,我将密码短语加密一次,解码部分包含在我的脚本中。我已经测试过它,它工作正常,但我无法弄清楚哪个变量保存解码密码在我的gpg2.exe参数中使用它。 – culter 2012-04-16 12:13:54

+0

好的,我已经解决了。我已将解码部分包含到脚本中,并使用$ end.GetString($ clearPWD_ByteArray)作为密码。请确认此方法是否正确(安全)。谢谢。 – culter 2012-04-16 12:57:22

+0

该口令在'$ enc.GetString($ clearPWD_ByteArray)' – JPBlanc 2012-04-16 13:04:04