Как зашифровать с использованием учетных данных текущего пользователя Windows в powershell для KeePass? - PullRequest
0 голосов
/ 07 июня 2018

Мне нужно написать скрипт, который шифрует строку так же, как {PASSWORD_ENC} заполнитель шифруется в KeePass:

{PASSWORD_ENC} - Шифрование паролей:

Заполнитель {PASSWORD_ENC} заменяется паролем текущей записи в зашифрованном виде. Пароль зашифрован с использованием учетных данных текущего пользователя Windows. Зашифрованный пароль не должен храниться и работает только для текущего пользователя.

(выделено мной)

Как программно зашифровать строку, чтобы получить тот же зашифрованный пароль, который я получу в KeePass?

1 Ответ

0 голосов
/ 07 июня 2018

Из исходного кода KeePass (\KeePassLib\Utility\StrUtil.cs)

private static readonly byte[] m_pbOptEnt = { 0xA5, 0x74, 0x2E, 0xEC };

public static string EncryptString(string strPlainText)
{
    if(string.IsNullOrEmpty(strPlainText)) return string.Empty;

    try
    {
        byte[] pbPlain = StrUtil.Utf8.GetBytes(strPlainText);
        byte[] pbEnc = ProtectedData.Protect(pbPlain, m_pbOptEnt,
            DataProtectionScope.CurrentUser);

#if (!KeePassLibSD && !KeePassRT)
        return Convert.ToBase64String(pbEnc, Base64FormattingOptions.None);
#else
        return Convert.ToBase64String(pbEnc);
#endif
    }
    catch(Exception) { Debug.Assert(false); }

    return strPlainText;
}

К счастью, мы можем использовать члены .NET в PowerShell и делать то же самое:

[System.Reflection.Assembly]::LoadWithPartialName('System.Security') | Out-Null;
[byte[]] $m_pbOptEnt = @(0xA5,0x74,0x2E,0xEC);
$plainBytes = [System.Text.Encoding]::UTF8.GetBytes( "my super strong password is 123456" );
$cipherBytes = [System.Security.Cryptography.ProtectedData]::Protect($plainBytes, $m_pbOptEnt, [System.Security.Cryptography.DataProtectionScope]::CurrentUser);
$cipherPw = [System.Convert]::ToBase64String($cipherBytes);
...