openssl dgst -sha1 -binary
バイナリ形式で文字列のハッシュ値を取得するために使用しています。
(-binary
私のバージョンのopensslは基本的に各ハッシュ値の出力の前に "stdout"を追加してそれを防ぐのに役立ちますので、さらなる処理のためにハッシュ結果をバイナリ形式で保存する方が簡単なので、フラグを使用しています(したがって使用します)とき-binary
にxxd -p
動作します)。stdout
openssl dgst -sha1 -binary
したがって、Cygwinコンソールの「Hello!」バイナリ出力文字列は次のとおりです。
この結果を使用して新しい変数を作成し、値がバイナリ型以外の変数(「World」など)と関連付けられます。今私の新しい変数は次のようになります。
_▒ "Q▒%▒a▒▒▒▒.&c ▒0n▒q▒▒vh & 8iworld
次に、この接続文字列の別のハッシュを生成し、それをデフォルトのJavaハッシュライブラリ()を使用して取得したハッシュと比較しますMessageDigest
。しかし、この段階では、シェルとJavaで取得したハッシュ値が一致しません(Java側で作成したものとまったく同じ値を取得する必要があります)。
したがって、私はJavaハッシュ出力と一致するように "World"文字列もバイナリ形式でなければならないと思いました(接続されたバイナリ値のハッシュを生成する限り、すべてのハッシュが一致するため)。しかし、シェルで "World"文字列をバイナリ形式に変換する方法がわかりません。どんなアイデアがありますか?
答え1
君は保存できないバイナリ変数内のデータ(バイナリデータは通常有効な文字を形成しますが、特殊でないバイト値だけでなく任意のバイト値を持つデータも表します)、変数にバイト値を格納することはサポートされていないbash
ためbash
(0
文字列を渡すことができますなしを覚えておいてください)NULで区切られた文字列なので、このようなコマンド引数に使用されます。
zsh
しかし、入ることはできます。また、コマンド置換は末尾の改行(0xaバイト、Cygwinでは異なる場合があります)を削除するため、read
ここで使用するのが最善です。
$ echo 323 | openssl dgst -sha1 -binary | hd
00000000 3a 8b 03 4a 5d 00 e9 07 b2 9e 0a 61 b3 54 db 45 |:..J]......a.T.E|
00000010 63 4b 37 b0 |cK7.|
00000014
0バイトと改行文字(0xa)の両方がどのように含まれているかを確認してください。
$ echo 323 | openssl dgst -sha1 -binary | IFS= LC_ALL=C read -ru0 -k20 var &&
var=${var}World
$ printf %s $var | hd
00000000 3a 8b 03 4a 5d 00 e9 07 b2 9e 0a 61 b3 54 db 45 |:..J]......a.T.E|
00000010 63 4b 37 b0 57 6f 72 6c 64 |cK7.World|
00000019
この変数は組み込みコマンド(printf
...)にのみ渡すことができることに注意してください。
もう欲しいものが再ハッシュするだけなら、
(echo 323 | openssl dgst -sha1 -binary; printf %s World) |
openssl dgst -sha1 -binary
変数は必要ありません。