对 Plink/PuTTY 使用加密密码

Posted

技术标签:

【中文标题】对 Plink/PuTTY 使用加密密码【英文标题】:Use encrypted password for Plink/PuTTY 【发布时间】:2018-04-14 15:38:31 【问题描述】:

我想在 PowerShell 中加密密码并将其与 plinkputty 一起使用。

是的,我知道它只需要明文密码 (Password encryption using SecureString for plink.exe command)。

不,我不会使用生成的密钥,因为我们不支持它。

我的问题:

    任何建议如何在puttyplink 中为-pw 标志使用加密密码 我可以生成特定的字符串作为键吗?我的意思是获取当前的明文密码并将其转换为密钥,然后将其用作-i 而不是-pw

我的securePass.ps1 代码:

$password = read-host -prompt "Enter your Password" 
write-host "$password is password" 
$secure = ConvertTo-SecureString $password -force -asPlainText 
$bytes = ConvertFrom-SecureString $secure 
$bytes | out-file C:\encrypted_password1.txt

主要:

$securePass = Get-Content C:\encrypted_password1.txt
$pass = $securePass | ConvertTo-SecureString
plink -batch -ssh $defUser@$srv -pw $pass
putty -ssh $defUser@$srv -pw $pass

【问题讨论】:

【参考方案1】:

如您所知,PuTTY/Plink 不能使用加密密码 (SecureString)。

您所能做的就是解密安全字符串并将解密后的纯文本密码传递给 PuTTY/Plink。

解密见PowerShell - Decode System.Security.SecureString to readable password:

$securePass = Get-Content C:\encrypted_password1.txt
$pass = $securePass | ConvertTo-SecureString

$Ptr = [System.Runtime.InteropServices.Marshal]::SecureStringToCoTaskMemUnicode($pass)
$decrypted = [System.Runtime.InteropServices.Marshal]::PtrToStringUni($Ptr)
[System.Runtime.InteropServices.Marshal]::ZeroFreeCoTaskMemUnicode($Ptr)
plink -batch -ssh $defUser@$srv -pw $decrypted 

您的问题 2) 没有任何意义。您写道,您不能使用密钥。所以你不能使用-i 开关。让我们只使用一些“生成的密码”。

【讨论】:

【参考方案2】:
$Credential = $(Get-Credential)
$user = $Credential.GetNetworkCredential().Username
$pass = $Credential.GetNetworkCredential().Password

是我在脚本中使用的,然后我使用 -pw; $ $putty -ssh $server -l $user -pw $pass -m $command

我知道你说你做了 -I 而不是 -pw 但是我发现这很好用,因为没有文件存储在任何地方你的密码。

【讨论】:

【参考方案3】:

这是我的解决方案,它在菜单循环中运行。效果很好。 我只需要“缓存”我键入的输入或(将先前输入的凭据自动传递到对话框中)否则每次我必须重新输入凭据时。

$Key = New-Object Byte[] 32
     [Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($Key)
$Key | Out-File AES.key
(get-credential).Password | ConvertFrom-   SecureString -key (get-content AES.key) | set-content "AESPassword.txt"
$password = Get-Content AESPassword.txt |   ConvertTo-SecureString -Key (Get-Content AES.key)
$credential = New-Object System.Management.Automation.PsCredential($env:userName,$password)
$ServerName = Read-Host -Prompt "What is the server name?"
$Command = ".\plink.exe"
$arg1  =  '-t'
$arg2 = $credential.GetNetworkCredential().username+'@'+$ServerName
$arg3 = '-pw'
$arg4 = $credential.GetNetworkCredential().Password
$arg5 = $scriptcmd
#Write-Output $Command $arg1 $arg2 $arg3 $arg4 $arg5
& $Command $arg1 $arg2 $arg3 $arg4 $arg5

【讨论】:

与您的previous answer 一样,这没有意义。您提示用户输入密码,使用“复杂”代码对其进行加密,然后将其解密并将解密后的密码传递给 Plink。为什么? - 我已经给你写过几次了:别再浪费你的时间了。您不能将加密密码传递给 Plink。没办法。 你介意不要评论我的帖子吗?看来你的固执无法看到别人的观点。这对我有用,如果你不喜欢它...继续:)

以上是关于对 Plink/PuTTY 使用加密密码的主要内容,如果未能解决你的问题,请参考以下文章

PHP如何对用户密码进行加密

SCrypt对密码进行加密及密码验证

使用Bcrypt对密码进行加密与解密验证

如何使用java对密码加密 加密方式aes

使用druid 数据池对连接密码加密

Java使用MD5加盐对密码进行加密处理,附注册和登录加密解密处理