文字列をバイト配列に変換するとします。
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
標準入力はバイトストリームです。
内容は$user
ゼロ以外のバイトのシーケンスです(UTF-8または他の文字セット/エンコーディングで有効な文字を形成してもしなくてもかまいません)。
printf %s "$user"
標準出力はバイトストリームです。
printf %s "$user" | openssl dgst -sha256 –binary
printf
標準出力をopenssl
標準入力に接続します。openssl
標準出力は別のバイトストリームです。
端末からユーザーから入力をすると、$user
ユーザーはキーボードのキーを押して入力します。端末は、設定された文字セット(キーラベルに記録されているように)でエンコードされた対応する文字を送信します。通常、この文字セットは現在のロケールの文字セットに基づいています。それが何であるかがわかりますlocale charmap
。
たとえば、ロケールがそのロケールから始まるfr_FR.iso885915@euro
と、この値が返されます。ユーザーがユーザー名を入力すると、そのユーザー名は文字セットが定義されているため、バイトでエンコードできます。xterm
locale charmap
ISO-8859-15
stéphane
é
0xe9
ISO-8859-15
é
UTF-8に渡す前にUTF-8でエンコードするには、openssl
ここでiconv
そのバイトを0xe9
UTF-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