2016-03-22 9 views
0

javaでこれを行うコードを教えてください。javaでhash sha256を使用してハッシュコードを生成するにはどうすればよいですか?

これは私がこれまで行ってきたことですが、動作しません。

import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import static jdk.nashorn.tools.ShellFunctions.input; 

public class Sha256hash 
{ 

    public static String main(String[] args) throws NoSuchAlgorithmException 
    { 
     MessageDigest md = MessageDigest.getInstance("SHA1"); 
      md.reset(); 
      byte[] buffer = input.getBytes("UTF-8"); 
      md.update(buffer); 
      byte[] digest = md.digest(); 

      String hexStr = ""; 
      for (int i = 0; i < digest.length; i++) { 
       hexStr += Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1); 
      } 
      return hexStr; 
    } 

} 
+1

なぜいけないのでしょうか?どうしたの? – SLaks

+0

それは私に入力のエラーを与えます。それはシンボル –

+1

を見つけることができません。あなたの投稿されたコードのどこでも 'input'が宣言されていないためです。また、 'SHA1'!=' SHA256'。 –

答えて

3

私はまだあなたがSHA-1 または SHA-256をしたいかどうかは不明だけど、そう抽象問題ましょう。まず、エンコード方法はbyte[]を取り、六角を返すために(心配しないで、あなたはすでにそれを書いたが、私はStringBuilderString以上連結したものを好むだろうJavaのString不変である、あなたはゴミを作成しているので。 +と後でガベージコレクション) -

private static String encodeHex(byte[] digest) { 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < digest.length; i++) { 
     sb.append(Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1)); 
    } 
    return sb.toString(); 
} 

次に、我々は消化するためにアルゴリズム名とStringを取り、そのダイジェストを返すメソッドを作成することができます。

public static String digest(String alg, String input) { 
    try { 
     MessageDigest md = MessageDigest.getInstance(alg); 
     byte[] buffer = input.getBytes("UTF-8"); 
     md.update(buffer); 
     byte[] digest = md.digest(); 
     return encodeHex(digest); 
    } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) { 
     e.printStackTrace(); 
     return e.getMessage(); 
    } 
} 

のようにその後、我々は得ることができますSHA-1または(予想通り)を出力

public static void main(String[] args) { 
    System.out.println(digest("SHA1", "")); 
    System.out.println(digest("SHA-256", "")); 
} 

ようSHA-256ハッシュ

da39a3ee5e6b4b0d3255bfef95601890afd80709 
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 
1

メインエントリポイントは文字列を返すことができません。さらに、inputは宣言されていません。関数の名前をgenerateに変更し、inputをパラメータとして変更することができます。

import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 
import static jdk.nashorn.tools.ShellFunctions.input; 

public class Sha256hash 
{ 

    public static String generate(String input) throws NoSuchAlgorithmException 
    { 
     MessageDigest md = MessageDigest.getInstance("SHA1"); 
      md.reset(); 
      byte[] buffer = input.getBytes("UTF-8"); 
      md.update(buffer); 
      byte[] digest = md.digest(); 

      String hexStr = ""; 
      for (int i = 0; i < digest.length; i++) { 
       hexStr += Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1); 
      } 
      return hexStr; 
    } 

} 

この例は、文字列exampleを処理した結果としてc3499c2729730a7f807efb8676a92dcb6f8a3f8fを返す私の作品:

import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 

public class Sha256hash 
{ 

    public static String generate(String input) throws NoSuchAlgorithmException, UnsupportedEncodingException 
    { 
     MessageDigest md = MessageDigest.getInstance("SHA1"); 
      md.reset(); 
      byte[] buffer = input.getBytes("UTF-8"); 
      md.update(buffer); 
      byte[] digest = md.digest(); 

      String hexStr = ""; 
      for (int i = 0; i < digest.length; i++) { 
       hexStr += Integer.toString((digest[i] & 0xff) + 0x100, 16).substring(1); 
      } 
      return hexStr; 
    } 

} 

メイン:

import java.io.UnsupportedEncodingException; 
import java.security.NoSuchAlgorithmException; 

public class Tester { 
    public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException { 
     String someText = "example"; 
     System.out.println(Sha256hash.generate(someText)); 
    } 
} 

を最後に、あなたが使用したい場合はエリオットが指摘したようにSHA-256 MessageDigest.getInstance("SHA1");MessageDigest.getInstance("SHA256")に変更する必要があります。今はSHA-1を使用しています。またElliotが指摘したところでは、ループの効率を上げるためにStringBuilderを使用するべきです。

関連する問題