md5sum コマンドの代替としての StreamRelay.jar (ハッシュ/チェックサム/HMAC計算)

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar`
⇔
`StreamRelay.bat`

Javaには、ストリームを流れるデータのハッシュ/チェックサム/HMACの計算をすることができる。

### md5sum コマンドの代替としての StreamRelay.jar

`md5sum.exe a.txt`
⇔
`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -LocalPort 0 -LocalInputFile a.txt -RemotePort 0 -LocalRequestHashAlgorithm MD5` 

で、ファイルa.txtのMD5が計算される

### チェックサムの指定方法

- -LocalRequest[Adler32|CRC32|XXHash32]
- -RemoteRequest[Adler32|CRC32|XXHash32]
- -LocalResponse[Adler32|CRC32|XXHash32]
- -RemoteResponse[Adler32|CRC32|XXHash32]

または

- -LocalInput[Adler32|CRC32|XXHash32]
- -RemoteInput[Adler32|CRC32|XXHash32]
- -LocalOutput[Adler32|CRC32|XXHash32]
- -RemoteOutput[Adler32|CRC32|XXHash32]

### ハッシュの指定方法

- -LocalRequestHashAlgorithm "アルゴリズム名"
- -RemoteRequestHashAlgorithm "アルゴリズム名"
- -LocalResponseHashAlgorithm "アルゴリズム名"
- -RemoteResponseHashAlgorithm "アルゴリズム名"

または

- -LocalInputHashAlgorithm "アルゴリズム名"
- -RemoteInputHashAlgorithm "アルゴリズム名"
- -LocalOutputHashAlgorithm "アルゴリズム名"
- -RemoteOutputHashAlgorithm "アルゴリズム名"

### ハッシュのアルゴリズム名の一覧

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -ListHash`

### HMAC の指定方法

HMAC の場合は、
- -LocalRequestHMACAlgorithm "アルゴリズム名" "鍵"
- -RemoteRequestHMACAlgorithm "アルゴリズム名" "鍵"
- -LocalResponseHMACAlgorithm "アルゴリズム名" "鍵"
- -RemoteResponseHMACAlgorithm "アルゴリズム名" "鍵"

とか

- -LocalInputHMACAlgorithm "アルゴリズム名" "鍵"
- -RemoteInputHMACAlgorithm "アルゴリズム名" "鍵"
- -LocalOutputHMACAlgorithm "アルゴリズム名" "鍵"
- -RemoteOutputHMACAlgorithm "アルゴリズム名" "鍵"

というように指定すればよい。

**"鍵"** に 16進数表記を使いたい場合は、各オプションに "Hex" をつける
例えば

- -RemoteOutputHMACAlgorithm**Hex** "アルゴリズム名" "16進数表記の鍵"

### HMACのアルゴリズム名の一覧

`java.exe -Djava.security.policy=StreamRelay.policy -jar StreamRelay.jar -ListHMAC`

### 全アルゴリズムで計算

`C:\>type a.txt
HelloWorld
C:\>StreamRelay.bat -localport 0 -remoteport 0 -localinputfile a.txt -LocalRequestAllHashAlgorithm
HelloWorld
Request Input Stream ReadByteCount=10
Request Input Stream MessageDigest is 293cd96eb25228a6fb09bfa86b9148ab69940e68903cbc0527a4fb150eec1ebe0f1ffce0bc5e3df312377e0a68f1950a (SHA-384)
Request Input Stream MessageDigest is b07a0b24d54879214f2361e0a1ac320442fa4e53a0f607d126fbfb8a (SHA-224)
Request Input Stream MessageDigest is 872e4e50ce9990d8b041330c47c9ddd11bec6b503ae9386a99da8584e9bb12c4 (SHA-256)
Request Input Stream MessageDigest is 4227ce10dca49dd2d0ba3f438d1ea9f3 (MD2)
Request Input Stream MessageDigest is db8ac1c259eb89d4a131b253bacfca5f319d54f2 (SHA)
Request Input Stream MessageDigest is 8ae6ae71a75d3fb2e0225deeb004faf95d816a0a58093eb4cb5a3aa0f197050d7a4dc0a2d5c6fbae5fb5b0d536a0a9e6b686369fa57a027687c3630321547596 (SHA-512)
Request Input Stream MessageDigest is 68e109f0f40ca72a15e05cc22786f8e6 (MD5)
Request Input Stream MessageDigest is eeb411aa88f5aa55532c03088df78b18 (MD4)
Request Input Stream Checksum is 357958653(0x155603FD)
Request Input Stream Checksum is 2004290681(0x77770C79)
Request Input Stream Checksum is 2095561169(0x7CE7B9D1)`

### 全アルゴリズムで計算(鍵付き)

鍵として「0x010203」とする。

鍵の不要なものと必要なものの全アルゴリズムの計算結果を出力する

`C:\>type a.txt
HelloWorld
C:\>StreamRelay.bat -localport 0 -remoteport 0 -localinputfile a.txt -LocalRequestAllHMACAlgorithmHex 010203
HelloWorldRequest Input Stream ReadByteCount=10
Request Input Stream MessageDigest is 293cd96eb25228a6fb09bfa86b9148ab69940e68903cbc0527a4fb150eec1ebe0f1ffce0bc5e3df312377e0a68f1950a (SHA-384)
Request Input Stream MessageDigest is b07a0b24d54879214f2361e0a1ac320442fa4e53a0f607d126fbfb8a (SHA-224)
Request Input Stream MessageDigest is 872e4e50ce9990d8b041330c47c9ddd11bec6b503ae9386a99da8584e9bb12c4 (SHA-256)
Request Input Stream MessageDigest is 4227ce10dca49dd2d0ba3f438d1ea9f3 (MD2)
Request Input Stream MessageDigest is db8ac1c259eb89d4a131b253bacfca5f319d54f2 (SHA)
Request Input Stream MessageDigest is 8ae6ae71a75d3fb2e0225deeb004faf95d816a0a58093eb4cb5a3aa0f197050d7a4dc0a2d5c6fbae5fb5b0d536a0a9e6b686369fa57a027687c3630
321547596 (SHA-512)
Request Input Stream MessageDigest is 68e109f0f40ca72a15e05cc22786f8e6 (MD5)
Request Input Stream MessageDigest is eeb411aa88f5aa55532c03088df78b18 (MD4)
Request Input Stream HMAC is 4b9b6b3e5df13235f5f52c9d5ba071ac486dcf4bdb531f497e2ad412b2d2111df618181f3a8903bd1212b8f2f20a70f1
Request Input Stream HMAC is 3c0daf444f7c8cab802690f2828ba4dc97b41921f71cfcd6d05a88d079210c0e
Request Input Stream HMAC is 5015e6f51667557962b917110ffa24e66d586915a9c7fa92d9b484e9
Request Input Stream HMAC is 9c45c296d77588f2e9a9d487834b1aea
Request Input Stream HMAC is fb20ccf18ee332d01f72b550a4ad608a11923365
Request Input Stream HMAC is 4d13737eb6f490d9a11bd262535f5445c92103ac294e4fa76a1de3fb04475db6be36d35bbdf0d77e2a2f6988bcf773ad588e16211ce7a8bb6ed55d2d94e3714e
Request Input Stream HMAC is 23832a0a36357acab111d0243bb9410d
Request Input Stream HMAC is c4ac2c329304087db636cfb3444ccd096e86078a
Request Input Stream Checksum is 357958653(0x155603FD)
Request Input Stream Checksum is 2004290681(0x77770C79)
Request Input Stream Checksum is 2095561169(0x7CE7B9D1)`

**ver6.4だとアルゴリズム名が出ないな・・・orz**

### 対応しているアルゴリズム

ver6.4 では

- Adler32
- CRC32
- XXHash32
- SHA-384
- SHA-224
- SHA-256
- MD2
- SHA
- SHA-512
- MD5
- MD4
- PBEWITHHMACSHA512
- PBEWITHHMACSHA224
- PBEWITHHMACSHA256
- HMACSHA384
- PBEWITHHMACSHA384
- HMACSHA256
- HMACPBESHA1
- HMACSHA224
- HMACMD5
- PBEWITHHMACSHA1
- SSLMACSHA1
- HMACSHA512
- SSLMACMD5

ver8.2から

- CRC64
- XXHash64

が追加した


---
### (多段)プロキシとしてのハッシュ計算

上記のオプションは、全てストリームの実体(ソース)になるべく近い位置(入力してすぐ、または出力の最後の段階とか)で計算するようにしているが、計算位置を制御したい場合は、

- -Proxy JavaStream://オプション

を使って多段プロキシの設定のように指定する

---
### カウンティング (おまけ)

入出力データのバイト数を計算するオプションもあるよ

- -LocalRequestCount
- -RemoteRequestCount
- -LocalResponseCount
- -RemoteResponseCount
とか
- -LocalInputCount
- -RemoteInputCount
- -LocalOutputCount
- -RemoteOutputCount

---
### 目次へ戻る

[目次というか最初の一歩](http://qiita.com/tomoki0sanaki/items/85f20cbe18378e33cd6f)