Unix Shell(Cygwin)의 Java String.getBytes()와 동일합니다.

Unix Shell(Cygwin)의 Java String.getBytes()와 동일합니다.

문자열을 바이트 배열로 변환한다고 가정해 보겠습니다.

byte[] byte sUserID.getBytes(“UTF-8”);  //Convert User ID String to byte array    

이제 Java 코드와 정확히 동일한 기능을 가진 스크립트를 셸에서 작성해야 합니다. 어떤 단계에서는 바이트 배열( MessageDigest.getInstance(“SHA-256”)Java 및 Shell에서 사용됨) 을 해시해야 openssl dgst -sha256 –binary하지만 Java 코드의 다이제스트는 바이트 배열에서 생성되므로 Shell 일치에서 얻은 결과와 동일하지 않습니다. shell 지금은 문자열을 해싱하는 중이므로 입력 형식이 일치하지 않습니다.)

쉘의 입력은 Java 입력과 유사해야 하므로 쉘에서 메소드를 "시뮬레이트"할 openssl수 있는 방법이 있는지 궁금합니다 . getBytes()저는 쉘에 대한 경험이 많지 않기 때문에 이 상황에서 가장 좋은 접근 방식이 무엇인지 모르겠습니다. 어떤 아이디어가 있나요? 건배!

답변1

openssl표준 입력은 바이트 스트림입니다.

내용은 $user0이 아닌 바이트의 시퀀스입니다(UTF-8 또는 기타 문자 세트/인코딩에서 유효한 문자를 형성할 수도 있고 형성하지 않을 수도 있음).

printf %s "$user"표준 출력은 바이트 스트림입니다.

printf %s "$user" | openssl dgst -sha256 –binary

printf표준 출력을 openssl표준 입력 에 연결합니다 . openssl표준 출력은 또 다른 바이트 스트림입니다.

이제 터미널에서 사용자로부터 입력을 하면 $user사용자는 키보드의 키를 눌러 입력하게 됩니다. 터미널은 구성된 문자 세트(키 라벨에 기록된 대로)로 인코딩된 해당 문자를 보냅니다. 일반적으로 이 문자 집합은 현재 로케일의 문자 집합을 기반으로 합니다. 그것이 무엇인지 알 수 있습니다 locale charmap.

예를 들어, 로케일이 해당 로케일에서 시작 fr_FR.iso885915@euro되면 이 값이 반환됩니다 . 사용자가 사용자 이름을 입력하면 해당 사용자 이름은 문자 집합이 정의되는 방식이므로 바이트 로 인코딩될 수 있습니다 .xtermlocale charmapISO-8859-15stéphaneé0xe9ISO-8859-15

éUTF-8로 전달하기 전에 UTF-8로 인코딩 하려면 openssl여기에서 iconv해당 바이트를 0xe9UTF-8의 해당 인코딩으로 변환할 수 있습니다(2바이트 0xc3 0xa9: ).

IFS= read -r user # read username from stdin as a sequence of bytes
                  # assumed to be encoded from characters as per the
                  # locale's encoding
printf %s "$user" |
  iconv -t utf-8 | # convert from locale encoding to UTF-8
  openssl dgst -sha256 –binary 

관련 정보