- ベストアンサー
パスワードのMD5ダイジェスト化処理について
表題の件、「strutsによるwebアプリケーションスーパーサンプル第三版」で、以下の処理が理解できませんでした。 //byteを1つ取り、絶対値に変換する int n = md5[i] & 0xff; MD5やダイジェスト化について十分に理解できないないこともございますが、よろしければ簡潔にお教えいただけないでしょうか。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
前後がわからないとなんとも言えませんが、 MD5のメッセージダイジェストを取得するなら、 java.security.MessageDigestクラスで行うのが普通ですから、 取得したバイト配列を16進文字列化してたりしませんか? Javaのbyteは、-128~+127の値を保持できます。 しかし、byteの演算(正確には、byte,char,shortの演算)は、 一旦intに変換されてから行われます。 例えば、0xffはbyteなら2進数で表すと、 11111111bですが、 intに変換されると 11111111111111111111111111111111b になってしまいます。 10進数で表すと、byteでもintでも-1なんですがね。 これを0xff(11111111b)でandを取ると、 00000000000000000000000011111111b になるのです。 おそらく、Integer.toHexStringあたりを使っているのではないかと思われますが、 以下のコードを試してみると理解できるかと思います。 byte b = (byte)0xff; System.out.println(Integer.toHexString(b)); System.out.println(Integer.toHexString(b & 0xff));
その他の回答 (1)
- salsberry
- ベストアンサー率69% (495/711)
「絶対値に変換する」というコメントは正しくないですね。たとえばmd5[i]の値が-3だったとしたら、nの値は絶対値の3ではなくて253になります。 ANo.1の方が既に答えていますが、0xffとビットごとの論理積をとるのはbyte型(-128~+127)の値をint型の0~+255の範囲に変換するときの定石の書き方です。
お礼
> ANo.1の方が既に答えていますが、0xffとビットごとの論理積をとるのはbyte型 > (-128~+127)の値をint型の0~+255の範囲に変換するときの定石の書き方です。 お陰さまで納得できました。 ありがとうございます<(_ _)>
お礼
2番さんと組み合わせて、自分なりになんとなく理解できました。 ありがとうございました<(_ _)>