Cómo convertir una cadena segura a texto sin formato en PowerShell

  1. Utilizar la clase Marshal para convertir un Secure String a texto plano en PowerShell
  2. Utilizar el cmdlet ConvertFrom-SecureString para convertir un Secure String a texto plano en PowerShell
  3. Utilizar la clase NetworkCredential para convertir un Secure String a texto plano en PowerShell
  4. Utilizar el método GetNetworkCredential para convertir un Secure String a texto plano en PowerShell
  5. Conclusión
Cómo convertir una cadena segura a texto sin formato en PowerShell

PowerShell ofrece varios métodos para manejar objetos SecureString, que están diseñados para proteger información sensible en memoria. Sin embargo, hay escenarios donde se vuelve necesario convertir SecureString a texto plano a pesar de los riesgos de seguridad.

En este artículo, exploramos diferentes métodos para lograr esta conversión, incluyendo el uso de la clase Marshal, el cmdlet ConvertFrom-SecureString, la clase NetworkCredential y el método GetNetworkCredential(). Cada método ofrece sus ventajas y consideraciones, proporcionando flexibilidad en el manejo seguro de datos sensibles dentro de los scripts de PowerShell.

Utilizar la clase Marshal para convertir un Secure String a texto plano en PowerShell

En PowerShell, la clase [System.Runtime.InteropServices.Marshal] proporciona métodos para facilitar la interoperabilidad con código no administrado y manipular memoria. Dos de sus métodos, SecureStringToBSTR y PtrToStringAuto(), juegan un papel crucial en convertir SecureString a texto plano.

Ejemplo:

$secureString = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
$secureStringPtr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureString)
$plainText = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($secureStringPtr)
$plainText

En este ejemplo, primero creamos un objeto SecureString llamado $secureString que contiene la contraseña "MyPassword" usando el cmdlet ConvertTo-SecureString. Luego, usamos [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($secureString) para convertir el SecureString a una representación BSTR (Cadena Básica).

Finalmente, se utiliza [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($secureStringPtr) para convertir la representación BSTR a texto plano y almacenarlo en la variable $plainText.

Salida:

powershell securestring a texto plano - salida 1

Utilizar el cmdlet ConvertFrom-SecureString para convertir un Secure String a texto plano en PowerShell

El cmdlet ConvertFrom-SecureString convierte la cadena segura a una cadena estándar encriptada. A partir de PowerShell 7.0, se añadió un nuevo parámetro -AsPlainText, que convierte una cadena segura a una cadena de texto plano.

El siguiente ejemplo requiere PowerShell versión 7.0 o posterior.

Ejemplo:

$secureString = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
$plainText = ConvertFrom-SecureString -SecureString $secureString -AsPlainText
$plainText

En este ejemplo, comenzamos creando un objeto SecureString llamado $secureString que contiene la contraseña "MyPassword" usando el cmdlet ConvertTo-SecureString. Luego, utilizamos el cmdlet ConvertFrom-SecureString para convertir $secureString a su representación en texto plano, almacenando el resultado en la variable $plainText.

Salida:

powershell securestring a texto sin formato - salida 2

Utilizar la clase NetworkCredential para convertir un Secure String a texto plano en PowerShell

En PowerShell, la clase [System.Net.NetworkCredential] es parte del espacio de nombres System.Net del Framework .NET. Se utiliza principalmente para proporcionar credenciales para operaciones en red, como acceder a servicios web, servidores FTP o recursos compartidos en red.

Si bien su principal objetivo es la autenticación, también puede ser utilizada para convertir un SecureString a texto plano en escenarios donde se requieren credenciales de texto plano.

Ejemplo:

$secureString = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
$networkCredential = New-Object System.Net.NetworkCredential("", $secureString)
$plainText = $networkCredential.Password
$plainText

En este ejemplo, creamos un objeto SecureString llamado $secureString que contiene la contraseña "MyPassword" usando el cmdlet ConvertTo-SecureString. Luego, instanciamos un objeto System.Net.NetworkCredential, $networkCredential, proporcionando un nombre de usuario vacío (ya que no es necesario para nuestro propósito) y el SecureString que contiene la contraseña como parámetros.

Finalmente, recuperamos la contraseña en texto plano de $networkCredential.Password y la almacenamos en $plainText.

Salida:

powershell securestring a texto plano - salida 3

Utilizar el método GetNetworkCredential para convertir un Secure String a texto plano en PowerShell

En PowerShell, el método GetNetworkCredential() es parte de la clase PSCredential, que se utiliza para representar un conjunto de credenciales de usuario. Este método se emplea principalmente para extraer la representación en texto plano de la contraseña almacenada dentro de un objeto PSCredential.

Ejemplo:

$secureString = ConvertTo-SecureString "MyPassword" -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential("username", $secureString)
$plainText = $credential.GetNetworkCredential().Password
$plainText

En este ejemplo, comenzamos creando un objeto SecureString llamado $secureString que contiene la contraseña "MyPassword" usando el cmdlet ConvertTo-SecureString. A continuación, creamos un objeto PSCredential llamado $credential con un nombre de usuario ficticio y el $secureString como la contraseña.

Finalmente, utilizamos el método $credential.GetNetworkCredential().Password para extraer la contraseña en texto plano del objeto PSCredential.

Salida:

convertir securestring de powershell a texto plano - salida 4

Conclusión

En la programación de PowerShell, convertir SecureString a texto plano es un requisito común en varios escenarios. Al aprovechar métodos como la clase [System.Runtime.InteropServices.Marshal], el cmdlet ConvertFrom-SecureString, la clase [System.Net.NetworkCredential] o el método GetNetworkCredential(), los usuarios pueden manejar de manera segura información sensible mientras también cumplen con los requisitos operativos.

Ya sea interactuando con sistemas externos, API heredadas o operaciones en red, estos métodos proporcionan flexibilidad y conveniencia. Sin embargo, es crucial manejar datos sensibles con precaución y considerar las implicaciones de seguridad involucradas.

¿Disfrutas de nuestros tutoriales? Suscríbete a DelftStack en YouTube para apoyarnos en la creación de más guías en vídeo de alta calidad. Suscríbete
Rohan Timalsina avatar Rohan Timalsina avatar

Rohan is a learner, problem solver, and web developer. He loves to write and share his understanding.

LinkedIn Website

Artículo relacionado - PowerShell String