Преобразовать строку в байтовый массив в PowerShell версии 2 - PullRequest
21 голосов
/ 08 ноября 2011

То, что я пытаюсь сделать, это использовать шифрование SHA1 UTF-8, а затем кодирование base64 и значение строки пароля. Однако сначала мне нужно было выполнить шифрование, а затем кодирование, но я сделал это наоборот.

Вот код:

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

Итак, когда я пошел к хэшированию, я понял, что мне нужен байт [] из строки, и я не уверен, как это сделать. Я думаю, что есть простой способ из библиотек .Net, но не смог найти пример.

Так что, если у меня есть строка, например:

$string = "password"

Как мне преобразовать это в байтовый массив, который я могу использовать на :: ComputeHash ($ string)?

Итак, в итоге я должен получить зашифрованный пароль UTF-8 в кодировке SHA-1 и base 64, как и в приведенном выше коде, но он возвращается не так, как когда я кодировал то же самое в Java, где я зашифровал сначала он преобразовывает этот результат в кодировку base 64.

Я делаю предположение, что, хотя прямое шифрование строки не поддерживается в API, возможно, существует обходной путь, который позволит вам сделать это. Это то, что я пытаюсь сделать.

Итак, я предполагаю, что моя проблема с кодом заключается в том, что мне пришлось сначала зашифровать его, а затем закодировать, чтобы получить правильное значение. Исправить или я что-то здесь упускаю?

Вот соответствующий код Java, который работает:

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

Когда я запускаю код Java со строкой пароля «password», я получаю

[91, -86, 97, -28, -55, -71, 63, 63, 6, -126, 37, 11, 108, -8, 51, 27, 126, -26, -113, -40] который является шифрованием.

Тогда я при кодировании в Java получаю это: W6ph5Mm5Pz8GgiULbPgzG37mj9g =

но когда я запускаю его в PowerShell, я получаю это, потому что он сначала кодируется для UTF8:

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

Затем, когда я запускаю эту строку кода для ее преобразования, я получаю сообщение об ошибке:

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

Исключение, вызывающее «FromBase64String» с аргументом (ами) «1»: «Недопустимая длина для массива Base-64 char». В строке: 1 символ: 45

Однако, если я запускаю новую строку кода, чтобы сделать ее шестнадцатеричной снизу, я получаю:

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

5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8

но мне нужно в итоге получить это значение:

W6ph5Mm5Pz8GgiULbPgzG37mj9g =

Опять же, это даже невозможно сделать, но я пытаюсь найти обходной путь, чтобы увидеть.

Ответы [ 3 ]

25 голосов
/ 08 ноября 2011

Скорее всего, вам просто нужно конвертировать ваш хэш в base64 после последней строки.

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

Шрифтом-> Bytes-> Encrypt / Hash-> Base64

Это очень общий шаблон для отправки зашифрованных данных в текстовом формате.

2 голосов
/ 08 ноября 2011

Похоже, вы на правильном пути. Вы должны выбрать кодировку символов для преобразования между строкой и байтовым массивом. Вы выбрали UTF-8 выше, но есть и другие варианты (например, ASCII, UTF-16 и т. Д.).

Шифрование строки напрямую не поддерживается.

0 голосов
/ 15 августа 2018

Кажется, проблема в том, что в первом байтовом массиве у вас есть подписанные байты (-86 = 10101010), а во втором - байты без знака (170 = 10101010).

...