web-dev-qa-db-fra.com

Convertir une chaîne en tableau d'octets dans PowerShell version 2

Ce que j'essaie de faire est d'utiliser le chiffrement SHA1 UTF-8 puis le codage base64 et une valeur de chaîne de mot de passe. Cependant, je devais d'abord chiffrer, puis encoder, mais je l'ai fait dans l'autre sens.

Voici le code:

# 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) 

Donc, quand je suis allé faire le hachage, j'ai réalisé que je devais avoir un octet [] dans la chaîne et je ne savais pas comment faire. Je pense qu'il existe un moyen simple d'utiliser les bibliothèques .Net, mais je n'ai pas pu trouver d'exemple.

Donc si j'ai une ficelle, comme:

$string = "password"

Comment puis-je convertir cela en un tableau d'octets que je peux utiliser sur :: ComputeHash ($ string)?

Donc, je dois me retrouver avec un mot de passe UTF-8 codé SHA-1 et base 64 chiffré, ce que le code ci-dessus fait, mais il revient différent de celui que j’avais codé en Java, où je l’avais chiffré d’abord, puis converti ce résultat en encodage en base 64.

Je suppose que même si le cryptage d'une chaîne directement n'est pas pris en charge par l'API, il peut y avoir une solution de contournement qui vous permettra de le faire. C'est ce que je tente de faire.

Je suppose donc que le problème avec le code est que je devais d'abord le chiffrer, puis le coder pour obtenir la valeur correcte. Correct ou est-ce que je manque quelque chose ici?

Voici le code Java pertinent qui fonctionne:

//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));

Quand je lance le code Java avec la chaîne de mot de passe de "mot de passe", je reçois

[91, -86, 97, -28, -55, -71, 63, 63, 6, -126, 37, 11, 108, -8, 51, 27, 126, -26, -113, -40] qui est le cryptage.

Ensuite, lors de l’encodage en Java, j’obtiens ceci: W6ph5Mm5Pz8GgiULbPgzG37mj9g =

mais lorsque je l'exécute dans PowerShell, je reçois ce message car il est d'abord codé pour UTF8:

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

Ensuite, lorsque je lance cette ligne de code pour la convertir, une erreur se produit:

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

Exception appelant "FromBase64String" avec le ou les arguments "1": "Longueur non valide pour un tableau de caractères Base-64." A la ligne: 1 caractère: 45

Cependant, si j'exécute la nouvelle ligne de code pour qu'il soit hexagonal par en dessous, je reçois:

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

5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8

mais j'ai besoin de me retrouver avec cette valeur:

W6ph5Mm5Pz8GgiULbPgzG37mj9g =

Encore une fois, cela n’est peut-être même pas possible, mais j’essaie de trouver un moyen de contourner le problème.

21
James Drinkard

Vous avez probablement besoin de convertir votre hachage en base64 après la dernière ligne.

$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)

Texte-> Octets-> Crypter/Hash-> Base64

C'est un modèle très commun pour l'envoi de données cryptées au format texte.

24
Eric Nicholson

On dirait que vous êtes sur la bonne voie. Vous devez choisir un encodage de caractères à convertir entre une chaîne de caractères et un tableau d'octets. Vous avez choisi UTF-8 ci-dessus, mais il existe d'autres options (par exemple, ASCII, UTF-16, etc.).

Le cryptage direct d'une chaîne n'est pas pris en charge.

2
Matthew Flaschen

Le problème semble être que dans le premier tableau, vous avez octets signés (-86 = 10101010) et dans le deuxième octets non signés (170 = 10101010).

0
Nestori Syynimaa