То, что я пытаюсь сделать, это использовать шифрование 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 и базовым 64 кодом, который имеет код выше, но он возвращается иначе, чем когда я закодировал эту же вещь в java, где я зашифровал сначала, затем преобразовать этот результат в базовое 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 char: 45
Однако, если я запустил новую строку кода, чтобы сделать ее шестнадцатеричной снизу, я получаю:
$hexResult = [String]::Join("", ($result | % { "{0:X2}" -f $_}))
PS C:\Program Files (x86)\PowerGUI> Write-Host $hexResult
5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8
но мне нужно получить это значение:
W6ph5Mm5Pz8GgiULbPgzG37mj9g =
Опять же, это может быть даже невозможно сделать, но я пытаюсь найти обход, чтобы видеть.