En un post anterior vimos como crear contraseñas de manera automática con powershell y así tener más posibilidades de impresionar a nuestra chica. También igual nos era útil para otras cosas de sistemas, pero mola impresionar a una chica con comandos, que coño.
A veces, gestionar esas contraseñas en un script o en ficheros de configuración es complicado o sensible. Seguramente tu amigo de seguridad te de un par de ostias si encuentra las contraseñas escritas en claro o algún amigo chino o ruso te lo agradezca con un email y una fortuna enorme del rey de Wakanda
Encriptar de manera segura las contraseñas ya no será tu mayor problema. Vamos a crear un certificado
$cert = New-SelfSignedCertificate -Type DocumentEncryptionCertLegacyCsp -DnsName 'EncryptionCert' -HashAlgorithm SHA256
Con este certificado, que tiene una parte privada y otra publica vamos a jugar. Con la parte privada desencriptaremos contraseñas y con la parte publica las encriptaremos.
# Obtenemos el certificado del almacen mediante el nombre o cualquiera otra propiedad
$Cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -like "*CN=EncryptionCert*"}
# Creamos el objeto de credenciales que queremos encriptar para no almacenarla en txt
$cred=Get-Credential -Message "Rellena tus datos:" -UserName "Mi Usuario"
$Password=$cred.GetNetworkCredential().password
# Encriptamos la contraseña
$EncodedPwd = [system.text.encoding]::UTF8.GetBytes($Password)
$EncryptedBytes = $Cert.PublicKey.Key.Encrypt($EncodedPwd, $true)
$EncryptedPwd = [System.Convert]::ToBase64String($EncryptedBytes)Así queda la encriptación

Ahora mismo ver la contraseña es como ver las pelis esas antiguas de canal + sin decodificador (si no entiendes esto eres demasiado joven)
Podemos utilizar este trozo de código completo para generar la contraseña cifrada y que nos devuelva el código que tenemos que colocar en nuestro script para poder desencriptarlo.
# Obtenemos el certificado del almacen mediante el nombre o cualquiera otra propiedad
$Cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -like "*CN=EncryptionCert*"}
# Creamos el objeto de credenciales que queremos encriptar para no almacenarla en txt
$cred=Get-Credential -Message "Rellena tus datos:" -UserName "Mi Usuario"
$Password=$cred.GetNetworkCredential().password
# Encriptamos la contraseña
$EncodedPwd = [system.text.encoding]::UTF8.GetBytes($Password)
$EncryptedBytes = $Cert.PublicKey.Key.Encrypt($EncodedPwd, $true)
$EncryptedPwd = [System.Convert]::ToBase64String($EncryptedBytes)
cls
"Tu contraseña para $($cred.username): `n$EncryptedPwd"
"`n"
" Usa esto para tu script:"
' '
"##################################### CREDENTIAL ############################################################"
'$Cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -like "*CN=MYEncryptionCert*"}'
'$User=' + '"' + $($cred.UserName) + '"'
'$EncryptedPwd =' + '"' + $EncryptedPwd + '"'
'$EncryptedBytes = [System.Convert]::FromBase64String($EncryptedPwd)'
'$DecryptedBytes = $Cert.PrivateKey.Decrypt($EncryptedBytes, $true)'
'$DecryptedPwd = [system.text.encoding]::UTF8.GetString($DecryptedBytes)'
'$SecurePassword = convertto-securestring $DecryptedPwd -asplaintext -force'
'$Cred = new-object -typename System.Management.Automation.PSCredential -ArgumentList $User,$SecurePassword'
'##################################### CREDENTIAL ############################################################'
' 'Te genera algo así:
##################################### CREDENTIAL ############################################################
$Cert = Get-ChildItem Cert:\LocalMachine\My | Where-Object {$_.Subject -like "*CN=EncryptionCert*"}
$User="Usuario"
$EncryptedPwd ="KSMh+v9iAxuSu+SPya9dM34upJ6+JCTky0oA39uJQKGpSiBax/ZXLph7i0QjxOJPhQk+MnzZy2P9jRnaLAcbBOwxCcTf93CodkXb8ePBwnljtLe7XXjGiKE+nLDmP/cr5ltHYGzkERuczh6D+Oxtlhf0kDc2N7Gtzk9vd9nKxwu/Eo0RPbXYU89//EoZMOjNgntDYBA8z//yZl4UsrK/GUIUQA26plgUA0larc8kU0+ZfvuSiRyxP07mOwQveCTCtLpahFnLEn1tsEVkh4CzW4hRszegBop6QLykGX/Ne5VwAnCTvJ3KAov0hE4VLWCDqMVKtFJkirsrc2Lv1xBF67h4a9tL/gjlLPvqJSGhJc5Bh7tqw1MW1pOC1zBpc6hGoNKc0gQb1hBTYJ63V2dLgWx2l9dguspgBP6ki0yw/HfcRt2EHEW38NO67FvxWJrWk02ApE9+jNOYsKB/d5Dydr8gsjeAelyjqJGiKkb2xB2OP3B8sD4Xmc1w3wF2uC79JpLn5X9Zx+5cD9lOAa0kWr2eaxmdGoVnCo0e/m4zJHPH4TLBOLNqVVyfkWCXHO6wcFR6MW57JgHpjQxQeN5zM+imYUtHKSfPxWXz1tLYj/+RCct+k2poHwFiWW0D7u1hPNkWHzo3e4NLUkaENjl17wRuFLYJTdhqQpsEAIftD30vUOOoQ1s6drLPZ7ImAFgGUEo5ACK/ONyfj+UFAOVUH8+/swmNaHO87JnOkfCsfYFZWSxUIoVhC7mYmjOJJMfYwJsaFpfkbfd4YjsRl9bR1NRBjET2NUC1Nu4NehFLG25owR7xD7HV68PBy5Dgar2Hf5BsgtWwD+y1HIbV/4zFuYaORuvMiQEHpKU3N444iYB3qOHiA0844+XRiw5NWjOTV4AU9GO1IgGtBl94Dz8yDcOWg3JF0BuJOX4c4Rm13wD1N/z+Q9V+yn/baTOmkAkSVnsc5joiSan76/BBTo6Ewi12jhuhrrD98kItDPp9qpydmBWNst1MrRUgPOjwXnru"
$EncryptedBytes = [System.Convert]::FromBase64String($EncryptedPwd)
$DecryptedBytes = $Cert.PrivateKey.Decrypt($EncryptedBytes, $true)
$DecryptedPwd = [system.text.encoding]::UTF8.GetString($DecryptedBytes)
$SecurePassword = convertto-securestring $DecryptedPwd -asplaintext -force
$Cred = new-object -typename System.Management.Automation.PSCredential -ArgumentList $User,$SecurePassword
##################################### CREDENTIAL ############################################################Este código lo podemos usar de la siguiente manera:
Podemos usar la variable $DecryptedPwd para tener la contraseña en texto plano, por ejemplo se usa en autenticaciones básicas. También podemos usar el objeto de credenciales $CRED <PSCREDENTIAL> para usarlo en comandos de PowerShell directamente.

Como vemos, de este modo podemos usar las credenciales sin escribirlas en texto claro en los scripts o ficheros de configuración.
El certificado debemos mantenerlo de forma segura en el servidor que se va a usar y siempre podemos exportar la parte publica para encriptar las contraseñas en otros equipos, pero únicamente se podrán desencriptar donde este la parte privada instalada.
Con esto, puedes echarle imaginación y utilizarlo en muchos casos de uso distintos.