2011-01-08 8 views
2
package ewa; 
import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import java.math.BigInteger; 
/** 
* 
* @author Lotus 
*/ 
public class md5Hash { 

    public static void main(String[] args) throws NoSuchAlgorithmException { 
     String test = "abc"; 

     MessageDigest md = MessageDigest.getInstance("MD5"); 
     try { 
      md.update(test.getBytes("UTF-8")); 
      byte[] result = md.digest(); 
      BigInteger bi = new BigInteger(result); 
      String hex = bi.toString(16); 
      System.out.println("Pringting result"); 
      System.out.println(hex); 
     } catch (UnsupportedEncodingException ex) { 
      Logger.getLogger(md5Hash.class.getName()).log(Level.SEVERE, null, ex); 
     } 


    } 
} 

バイトから16進数への変換をテストしています。終了したら、最終結果に文字列の先頭にマイナス記号が付きます。なぜこれが起こりますか?私はドキュメントを読んだが、それはマイナス記号を追加すると言うが、私はそれを理解していない。マイナス記号はハッシュ結果に影響しますか?私は私のデータベースなぜ私のbigintegerの前にマイナス記号がありますか?

答えて

8

に格納されているパスワードをハッシュするためにそれを実装するつもりですので、BigIntegerがマイナスであることを起こるので、最上位ビットを意味することは、正の数をしたい場合は、sign-magnitude constructorを使用1.次のとおりです。

new BigInteger(1, result) 

自分のMD5ハッシュラッパーを実装する理由がわかりません。ハッシュをBINARYまたはBLOBとして保存できないのはなぜですか?

+0

ありがとう、それは問題を解決しました。私はちょうど私のウェブサイトのための非常に単純なハッシュを実装しており、バイナリまたはblobとしてハッシュを格納することによって何を意味するのか分からない – sutoL

+0

@kyrogue、例えば。 MySQLについては、[このドキュメント](http://dev.mysql.com/doc/refman/5.0/en/binary-varbinary.html)を参照してください。他のデータベースでも同様でなければなりません。バイナリタイプを使用すると、ハッシュを文字列に変換するステップが回避されます。 MD5は現在弱いと考えられるので、SHA-256のような別のハッシュを使うことも考慮する必要があります。 –

+0

私はデータベースのためのマイクロソフトのアクセスを使用するつもりです、それはデータベースのパスワードにmd5hashを表示することによって、非常に簡単な学校のプロジェクトです、それは私にいくつかの余分なマークを得ることができます – sutoL

0

BigIntegersに署名します。バイト表現では、最上位ビットがセットされている場合、これは負の数として示されます。これを回避する方法の1つは、配列の先頭に0を追加することです。