2017-09-05 2 views
0

私の目標は、文字列(この場合はパスワード)をMD5ハッシュにしてbase64に変換することでした。これは、ログオンを自動化しようとしているブラウザによって行われる暗号化の最初の部分です。パスワード "test"をテストすると、うまくいっています。しかし、 "asdf"を試してみると、私は異なったハッシュ値を得ています。 MD5ハッシュは常に正しいので、それがbase64変換パートの問題であることはわかっています。あなたは「ASDF」(912ec803b2ce49e4a541068d495ab570)のMD5ハッシュを見つけることによって、「正しい」出力を確認し、HEXボックスhere.Base64変換がJava Base64ライブラリで正しくない結果になった

パスワードで「テスト」https://ideone.com/SmaNsR
リンクを下記のコードのリンクにそれを貼り付けることができますjrtapsellの勧告、サンプルの入力と出力パー:「空自」と以下のコードのためのパスワードで/ OOSrmV

class myClass { 

    public static void main(String[] args) { 
     String password = "asdf"; 
     try { 
      System.out.println(password); 
      password = (passwordencrypt(password)); 
      System.out.println(password); 

     } catch (NoSuchAlgorithmException ex) { 
      System.out.println("oops"); 
     } 
     password = base16to64(password); 

     System.out.println(password); 

    } 

    public static String passwordencrypt(String password) throws NoSuchAlgorithmException { 
     MessageDigest md = MessageDigest.getInstance("MD5"); 
     md.update(password.getBytes()); 
     byte[] b = md.digest(); 
     StringBuffer sb = new StringBuffer(); 
     for (byte b1 : b) { 
      sb.append(Integer.toHexString(b1 & 0xff).toString()); 
     } 
     return sb.toString(); 
    } 
    public static String base16to64(String hex){ 
    return Base64.getEncoder().encodeToString(new BigInteger(hex, 16).toByteArray()); 
    } 

} 

EDITを(のみ2つのリンクを投稿することができます)。

入力: "テスト"
マイプログラム:CY9rzUYh03PK3k6DJie09gの==
それがどうあるべきか:CY9rzUYh03PK3k6DJie09gの==

入力: "空自" 私のプログラム:AJEuyDss5J5KVBaNSVq1cA ==それがどうあるべきか :kS7IA7LOSeSlQQaNSVq1cA ==

+0

予想される入力と出力を質問に追加して、より簡単に比較できるようにしてください。 – jrtapsell

+3

16進数で16進数でエンコードしてからbase64でエンコードするのはなぜですか? –

+0

@ElliottFrisch MD5はすでにbase64でエンコードされていますので、デコードしてbase64でエンコードします。このプロセス全体をなぜ尋ねるのかは、[このサイト](https://pschool.aaps.k12.mi.us/public/)に自動的にログインできるアプリを構築しようとしているためですそのサイトが資格情報を送信する方法です。 私がやろうとしているプロセスhex_md5> base64_md5 –

答えて

2

16進数に変換して16進数をデコードしてbase64にエンコードしないで、コードエンコードをbase64に直接単純化します。何かのように、

public static String passwordencrypt(String password) 
     throws NoSuchAlgorithmException { 
    MessageDigest md = MessageDigest.getInstance("MD5"); 
    md.update(password.getBytes()); 
    byte[] b = md.digest(); 
    return base64(b); 
} 

public static String base64(byte[] bytes) { 
    return Base64.getEncoder().encodeToString(bytes); 
} 

そしてmainbase16to64への呼び出しを削除し、私はあなたのリンク先のウェブサイト上のBase64文字列に一致する

kS7IA7LOSeSlQQaNSVq1cA== 

を取得します。

+0

うわー。それはずっと簡単です。解決済みと表示されます。 また、なぜこれが起こったのか分からないでしょうか?私がこれをやるもっと簡単な方法を持っている今、それは本当に重要ではありませんが、私はまだ興味があります。 –

+0

@SampathEaty 16進エンコーダーがオフであるか、または16進デコーダーがオフです。しかし、あなたは本当にどちらかを必要としないので、私はそれ以上の時間を費やすことはありません。 –

+0

@SampathEatyおそらく組み合わせ:1. 'password.getBytes()'はシステムのデフォルトの文字セットに依存していますが、これはすべてのオペレーティングシステムで同じではありません。 2. 'Integer.toHexString'は、0-15のバイト値に対して長さ1のStringを返します。 'BigInteger.toByteArray'は先頭のゼロバイトを無視します。たとえば、 'new BigInteger(" 000"、16).toByteArray()は4バイトではなく2バイトを返します。 – VGR

関連する問題