powershell encoding utf-8 bytearray sha1

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



encoding utf-8 (3)

Lo que estoy tratando de hacer es usar el cifrado SHA1 UTF-8 y luego la codificación base64 y en un valor de cadena de contraseña. Sin embargo, primero necesitaba hacer el cifrado, luego la codificación, pero 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 hashing, 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 forma simple de las bibliotecas .Net, pero no pude encontrar un ejemplo.

Así que si tengo una cuerda, como:

$string = "password"

¿Cómo lo convierto en una matriz de bytes que puedo usar en :: ComputeHash ($ string)?

Entonces, lo que tengo que hacer es una contraseña UTF-8 codificada en SHA-1 y 64 codificada, lo que hace el código anterior, pero vuelve diferente a cuando codifiqué esta misma cosa en java, donde la cifré primero. luego convirtió ese resultado en una base de codificación 64.

Supongo que si bien el cifrado de una cadena no es compatible directamente con la API, puede haber una solución alternativa que le permita hacerlo. Eso es lo que estoy tratando de hacer.

Así que asumo que mi problema con el código es que primero tuve que cifrarlo y luego codificarlo para obtener el valor correcto. Correcto o me estoy perdiendo algo aquí?

Aquí está el código java pertinente 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 contraseña de "contraseña" obtengo

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

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

pero cuando lo ejecuto en PowerShell, obtengo esto porque está codificado primero para UTF8:

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

Luego, cuando ejecuto esta línea de código para convertirla, aparece un error:

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

La excepción llama a "FromBase64String" con "1" argumento (s): "Longitud no válida para una matriz de caracteres Base-64". En línea: 1 char: 45

Sin embargo, si ejecuto la nueva línea de código para hacerlo hexadecimal desde abajo, obtengo:

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

5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8

pero necesito terminar con este valor:

W6ph5Mm5Pz8GgiULbPgzG37mj9g =

Una vez más, esto puede que ni siquiera sea posible hacerlo, pero estoy tratando de encontrar una solución alternativa para ver.


El problema parece ser que en el primer bytearray, tienes bytes firmados (-86 = 10101010) y en el segundo byte sin signo (170 = 10101010).


Lo más probable es que solo tengas que convertir tu hash a 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

Ese es un patrón muy común para enviar datos cifrados en un formato de texto.


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

No se admite el cifrado de una cadena directamente.