Powershell DPAPI Script



I am writing a backup script which is supposed to backup data to a remote server, encrypted, and run as a scheduled task on a Windows machine. If you want all of that, you will have to store the encryption key somewhere. Instead of storing the password in plaintext, I had the idea to use the [Data Protection API]. Initially worried that I might have to write a wrapper for [CryptProtectData] myself, I quickly found the decent looking github project [DPAPIbridge]. Ultimately however, I figured out that Powershell can do all things. Presenting `vault.ps1`: ```powershell Param( [string] $StoreSecret, [Parameter(Mandatory=$True,Position=0)] [string] $filename ) [void] [Reflection.Assembly]::LoadWithPartialName("System.Security") $scope = [System.Security.Cryptography.DataProtectionScope]::CurrentUser if ($StoreSecret -eq "") { $data = Get-Content $filename $ciphertext = [System.Convert]::FromBase64String($data) $plaintext = [System.Security.Cryptography.ProtectedData]::Unprotect( $ciphertext, $null, $scope ) [System.Text.UTF8Encoding]::UTF8.GetString($plaintext) } else { $plaintext = [System.Text.UTF8Encoding]::UTF8.GetBytes($StoreSecret) $ciphertext = [System.Security.Cryptography.ProtectedData]::Protect( $plaintext, $null, $scope ) [System.Convert]::ToBase64String($ciphertext) > $filename } ``` This script can be run as `vault.ps1 [-StoreSecret SECRET] FILE`. If the optional argument is present, it will store a protected blob containing `SECRET` in `FILE`, otherwise it will read a blob of protected data from `FILE` and print the enclosed secret string. [DPAPIbridge]: https://github.com/vincepare/DPAPIbridge [Data Protection API]: https://msdn.microsoft.com/en-us/library/ms995355.aspx [CryptProtectData]: https://msdn.microsoft.com/de-de/library/windows/desktop/aa380261(v=vs.85).aspx [Borg]: https://borgbackup.readthedocs.io/en/1.1.2/usage/general.html?highlight=borg_passcommand#environment-variables

Leave a Reply

Your email address will not be published. Required fields are marked *