¿Este tipo de cifrado es unidireccional?

0

Estoy escribiendo un script de Powershell que requiere una cuenta privilegiada para hacer algo. Por supuesto, no voy a incluir la contraseña de esta cuenta en el archivo .ps1 en texto claro, así que estoy siguiendo esta guía para crear una forma más segura de hacerlo: enlace

Aquí está el código que genera la clave y encripta la contraseña:

$KeyFile = "\Machine1\SharedPath\AES.key"
$Key = New-Object Byte[] 16   # You can use 16, 24, or 32 for AES
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($Key)
$Key | out-file $KeyFile

$PasswordFile = "\Machine1\SharedPath\Password.txt"
$KeyFile = "\Machine1\SharedPath\AES.key"
$Key = Get-Content $KeyFile
$Password = "P@ssword1" | ConvertTo-SecureString -AsPlainText -Force
$Password | ConvertFrom-SecureString -key $Key | Out-File $PasswordFile

$User = "MyUserName"
$PasswordFile = "\Machine1\SharedPath\Password.txt"
$KeyFile = "\Machine1\SharedPath\AES.key"
$key = Get-Content $KeyFile
$MyCredential = New-Object -TypeName System.Management.Automation.PSCredential '
 -ArgumentList $User, (Get-Content $PasswordFile | ConvertTo-SecureString -Key $key)

Sin embargo, la parte inferior del artículo menciona lo siguiente:

  

Asegúrese de proteger esa clave AES como si fuera su contraseña. Nadie   quién puede leer la clave AES puede descifrar cualquier cosa que haya sido cifrada con   it.

Por supuesto, cualquier persona con acceso tanto al archivo .ps1, que es texto claro de forma predeterminada, como al archivo de la clave AES, simplemente puede leer el código y usar el nombre de la cuenta y los archivos para crear un objeto PSCredential para hacer cosas. ¿Pero pueden usar el archivo de clave para descifrar el contenido del archivo Password.txt y obtener la contraseña de la cuenta en texto sin cifrar? Intenté hacer esto yo mismo con ConvertFrom-SecureString, pero fue en vano lo que, supongo, tiene sentido?

Observación adicional: el código debe funcionar en varias computadoras, por lo que no se pueden usar aquí mecanismos de encriptación "solo para máquinas locales" como se ve a menudo con Powershell.

    
pregunta Matthias 28.06.2018 - 09:29
fuente

1 respuesta

4

En primer lugar, el algoritmo de cifrado simétrico AES (que ConverTo-SecureString parece estar usando) definitivamente no es "unidireccional". Siempre puede recuperar la contraseña simple si tiene la clave, de lo contrario, incluso la muestra sugerida no funcionaría.

La fuente de su problema parece ser que este código de muestra parece un mal uso grave de la API PS / .NET. El propósito de los objetos SecureString es crearlos Los ataques de memoria son más difíciles al ocultar / eliminar información confidencial si no está en uso. Para lograr esto, SecureStrings puede usar cifrado, pero este es un detalle de implementación, no un servicio destinado a este tipo de uso "público". No obstante, la muestra puede funcionar, debe tener en cuenta que el cifrado (contraintuitivamente) se realiza mediante el cmdlet ConvertFrom, mientras que el descifrado se realiza con ConvertTo-.

Si desea una API adecuada para el inicio de encriptación aquí .

    
respondido por el buherator 28.06.2018 - 09:59
fuente

Lea otras preguntas en las etiquetas