如何在java中使用hash sha256生成哈希码?

时间:2016-03-22 18:41:17

标签: java hash sha256

我想知道在java中执行此操作的代码吗?

这是我到目前为止所做的但它不起作用?

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;
    }

}

2 个答案:

答案 0 :(得分:3)

我还不清楚你是否想要SHA-1 SHA-256,所以让我们抽象问题;首先,一个编码方法来获取byte[]并返回十六进制(不用担心,你已经写过了;但我希望StringBuilder超过{{ 1}}连接.Java String不可变的,所以你要用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哈希

SHA-256

哪些输出(如预期的那样)

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

答案 1 :(得分:1)

主入口点不能返回String。此外,未声明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;
    }

}

此示例适用于因处理字符串c3499c2729730a7f807efb8676a92dcb6f8a3f8f而返回example

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));
    }
}

最后,正如Elliott所指出的,如果你想使用SHA-256,你应该将MessageDigest.getInstance("SHA1");更改为MessageDigest.getInstance("SHA256");现在你正在使用SHA-1。 Elliot也指出,你应该在循环中使用StringBuilder来提高效率。

相关问题