programing

PowerShell 버전 2에서 문자열을 바이트 배열로 변환

topblog 2023. 8. 31. 23:33
반응형

PowerShell 버전 2에서 문자열을 바이트 배열로 변환

제가 하려는 것은 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) 

그래서 제가 해싱을 하러 갔을 때, 저는 현으로부터 바이트를 얻어야 한다는 것을 깨달았습니다. 그리고 어떻게 해야 할지 모르겠습니다.저는 간단한 방법이 있다고 생각합니다.넷 라이브러리이지만 예제를 찾을 수 없습니다.

그래서 만약 내게 끈이 있다면, 예를 들면:

$string = "password"

어떻게 하면 이를 :: ComputeHash($string)에서 사용할 수 있는 바이트 배열로 변환할 수 있습니까?

그래서 제가 마지막으로 해야 할 것은 암호화된 SHA-1과 64번으로 인코딩된 UTF-8 비밀번호입니다. 위의 코드는 제가 자바에서 처음 암호화한 다음에 그 결과를 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));

비밀번호 문자열 "password"로 Java 코드를 실행하면 다음 메시지가 표시됩니다.

[91, -86, 97, -28, -55, -71, 63, 63, 6, -165, 37, 11, 108, -8, 51, 27, 126, -26, -113, -40]은 암호화입니다.

자바로 인코딩하면 다음과 같이 표시됩니다.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)

"1" 인수를 사용하여 "FromBase64String"을(를) 호출하는 중 예외가 발생했습니다. "Base-64 문자 배열의 길이가 잘못되었습니다."라인:1 문자:45

하지만 아래에서 16진수로 만들기 위해 새로운 코드 라인을 실행하면 다음과 같이 됩니다.

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

5BAA61E4C9B93F3F0682250B6CF8331B7EE68FD8

하지만 이 값으로 끝나야 합니다.

W6ph5Mm5Pz8GgiULBPgzG37mj9g=

다시 말하지만, 이것은 불가능할지도 모르지만, 저는 해결책을 찾으려고 노력하고 있습니다.

대부분의 경우 마지막 줄 뒤에 해시를 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)

텍스트->바이트->암호화/해시->베이스64

이것은 암호화 데이터를 텍스트 형식으로 보내는 매우 일반적인 패턴입니다.

당신은 올바른 방향으로 가고 있는 것처럼 보입니다.문자열과 바이트 배열 간에 변환하려면 문자 인코딩을 선택해야 합니다.위에서 UTF-8을 선택했지만 다른 옵션(예: ASCII, UTF-16 등)이 있습니다.

문자열을 직접 암호화할 수 없습니다.

문제는 첫 번째 바이트 배열에서는 서명된 바이트(-86 = 101010)가 있고 두 번째 바이트(170 = 101010)가 있다는 것입니다.

언급URL : https://stackoverflow.com/questions/8051713/convert-a-string-to-a-byte-array-in-powershell-version-2

반응형