Convertir una cadena en una matriz de bytes en la versión 2 de PowerShell

Lo que estoy tratando de hacer es usar SHA1 UTF-8 de cifrado y, a continuación, la codificación base64 y una contraseña de la cadena de valor. Sin embargo, necesitaba hacer el cifrado de primera, luego de la codificación, pero yo lo hice al revés.

Aquí está el código:

# Create Input Data 
$enc = [system.Text.Encoding]::UTF8
$string1 = "This is a string to hash" 
$data1 = $enc.GetBytes($string1) 

# Create a New SHA1 Crypto Provider 
$sha = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider 

$# Now hash and display results 
$result1 = $sha.ComputeHash($data1) 

Entonces, cuando fui a hacer el hash me di cuenta de que tenía que tener un byte[] de la cadena y no estoy seguro de cómo hacerlo. Estoy pensando que hay una manera simple de el .Red de bibliotecas, pero no podía encontrar un ejemplo.

Así que si tengo una cadena de texto, como:

$string = "password"

¿Cómo puedo convertir de que en una matriz de bytes que puedo usar en :: ComputeHash($cadena)?

Entonces, ¿qué tengo que termina con un cifrado SHA-1 y codificada en base 64 UTF-8 contraseña, que el código de arriba lo hace, pero volviendo diferente que cuando lo programé esta misma cosa en java, donde me cifró en primer lugar, a continuación, convertir el resultado a codificación base 64.

Estoy haciendo la suposición de que, mientras que el cifrado de una cadena directamente no es compatible con la api, puede ser una solución que le permitirá hacer esto. Que es lo que estoy intentando hacer.

Así que estoy asumiendo mi problema con el código que tenía que codificar primero y luego codificarla para obtener el valor correcto. Correcto o me estoy perdiendo algo aquí?

Aquí es el pertinente código java que funciona:

//First method call uses a swing component to get the user entered password.
String password = getPassword(); 

//This line is where the work starts with the second and third methods below.
String hashed = byteToBase64(getHash(password));

//The second method call here gets the encryption.
public static byte[] getHash(String password) {
      MessageDigest digest = null;
      byte[] input = null;
      try {
             digest = MessageDigest.getInstance("SHA-1");
      } catch (NoSuchAlgorithmException e1) {
             e1.printStackTrace();
      }
      digest.reset();
      try {
             input = digest.digest(password.getBytes("UTF-8"));
      } catch (UnsupportedEncodingException e) {
             e.printStackTrace();
      }
      return input;
}

//Then the third method call here gets the encoding, FROM THE ENCRYPTED STRING.
public static String byteToBase64(byte[] data){
    return new String(Base64.encodeBase64(data));

Cuando ejecuto el código java con la cadena de la contraseña «password», me

[91, -86, 97, -28, -55, -71, 63, 63, 6, -126, 37, 11, 108, -8, 51, 27, 126, -26, -113, -40]
que es el cifrado.

Entonces yo cuando la codificación en java me sale esto:
W6ph5Mm5Pz8GgiULbPgzG37mj9g=

pero cuando lo ejecuto en PowerShell me sale esto, porque es codificada primera UTF8:

91 170 97 228 201 185 63 63 6 130 37 11 108 248 51 27 126 230 143 216

Entonces cuando me encuentro con esta línea de código para convertirla me sale un error:

$base64 = [System.Convert]::FromBase64String($result)

Excepción llamar «FromBase64String» con «1» argumento(s): «de longitud no válida para un Base-64 matriz de char.»
En línea:1 carácter:45

Sin embargo, si se me presenta la nueva línea de código para hacer de hex de debajo de recibir:

$hexResult = [String]::Join("", ($result | % { "{0:X2}" -f $_}))
PS C:\Program Files (x86)\PowerGUI> Write-Host $hexResult

5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8

pero tengo que terminar con este valor:

W6ph5Mm5Pz8GgiULbPgzG37mj9g=

De nuevo, esto puede incluso no ser posible hacerlo, pero estoy tratando de encontrar un trabajo a su alrededor para ver.

  • $data1 ya es una matriz de bytes – que es lo que Encoding.GetBytes($string1) devuelve.
  • Esperemos que no son en realidad el uso de UTF-9:en.wikipedia.org/wiki/UTF-9_and_UTF-18
  • No, es UTF-8, tuve un error tipográfico.
  • Usted no quiere FromBase64String, desea ToBase64String. Bytes != Base64. El código en mi ejemplo, produce exactamente el resultado que usted desea.
  • Estás en lo correcto, que funcionó!

3 Kommentare

  1. 26

    Es muy probable que usted necesita para convertir su hash base64 después de la última línea.

    $enc = [system.Text.Encoding]::UTF8
    $string1 = "This is a string to hash" 
    $data1 = $enc.GetBytes($string1) 
    
    # Create a New SHA1 Crypto Provider 
    $sha = New-Object System.Security.Cryptography.SHA1CryptoServiceProvider 
    
    # Now hash and display results 
    $result1 = $sha.ComputeHash($data1)
    [System.Convert]::ToBase64String($result1)

    Texto->Bytes->Cifrar/Hash->Base64

    Que un muy patrón común para el envío de los datos cifrados en un formato de texto.

    • Salvo que en este caso parece que la api requiere una matriz de bytes codificados y no sólo en una matriz de bytes.
    • No estoy seguro de lo que quieres decir por «api», sino una matriz de bytes no es consciente de cualquier codificación. El código de arriba jives con SHA-1 de los generadores (aunque algunas de salida hexagonal en lugar de Base64). Si el código Java es un hash ya codificado en Base64 de la cadena, entonces usted sin duda puede hacer que en PowerShell demasiado (pero sería inusual). Tal vez usted podría darnos la salida que el programa Java se produce…
    • El .Net Framework biblioteca. El código java que hace el cifrado de primera con un mensaje de digerir, entonces realiza la codificación UTF-8. Al parecer el .Net Framework no puede hacerlo de esa manera, es a lo que me refería. He intentado varias veces para obtener una matriz de bytes de una cadena, pero la única manera que tuvo éxito fue el uso de $codificación.getBytes(encodedString), no $somevariable.getBytes(regularString)
    • El Java de la clase MessageDigest también hash de una matriz de bytes y devuelve una matriz de bytes (que coincidirá con el .NETA equivalente), así que no estoy seguro de lo que vas a encontrar en el. Sin código o salida de ejemplo no estoy seguro de que podemos ayudar.
    • Entendido, voy a añadir el código de java en el ahora. Lo que quiero decir por «api» es sólo el .Net Framework biblioteca. No sé si esto estaba claro en los comentarios anteriores.
    • Gracias por agregar el código. Cuando lo ejecuto, se produce exactamente el mismo resultado que el PowerShell versión: «ehqG+vRfcgZXsJBvpcLeXXJ2/7s=»
    • permítanos seguir esta discusión en el chat

  2. 2

    Parece que estás en el camino correcto. Usted tiene que escoger una codificación de caracteres para convertir entre una cadena y una matriz de bytes. Has seleccionado UTF-8, pero hay otras opciones (por ejemplo, ASCII, UTF-16, etc.).

    Cifrar una cadena directamente no es compatible.

    • Soy nuevo en el .Net Framework, así que mientras no se admite directamente, ¿tiene una solución con el código que podría trabajar? Como el uso de una Corriente en lugar de una matriz de bytes?
    • no importa. De cualquier manera usted tiene para mapa de datos de carácter<=>byte de datos (flujos de bytes de datos). System.Encoding es la herramienta para eso. Usted tiene que utilizar algunos de codificación de este, pero no tiene que ser el UTF-8 que está usando actualmente.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Recent Articles

Python «set» con duplicados/elementos repetidos

Hay una forma estándar de representar un "conjunto" que puede contener elementos duplicados. Como yo lo entiendo, un conjunto tiene exactamente un cero o...

Python: generador de expresión vs rendimiento

En Python, ¿hay alguna diferencia entre la creación de un generador de objetos a través de un generador de expresión versus el uso de...

Cómo exportar/importar la Masilla lista de sesiones?

Hay una manera de hacer esto? O tengo que tomar manualmente cada archivo de Registro? InformationsquelleAutor s.webbandit | 2012-10-23

no distingue mayúsculas de minúsculas coincidentes en xpath?

Por ejemplo, para el xml a continuación <CATALOG> <CD title="Empire Burlesque"/> <CD title="empire burlesque"/> <CD...