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標準入力はバイトストリームです。

内容は$userゼロ以外のバイトのシーケンスです(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 

おすすめ記事