Как сгенерировать хэш-код с хэшем sha256 в java?

Я хотел бы знать код, чтобы сделать это в 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;
    }

}

person Community    schedule 22.03.2016    source источник
comment
Почему бы и нет? В чем проблема?   -  person SLaks    schedule 22.03.2016
comment
это дает мне ошибку при вводе. Пишет, что не может найти символ   -  person    schedule 22.03.2016
comment
Да, потому что input нигде в вашем опубликованном коде не объявлено. Кроме того, SHA1 != SHA256.   -  person Elliott Frisch    schedule 22.03.2016
comment
Ах да, где я должен объявить об этом?   -  person    schedule 22.03.2016
comment
Теперь я получаю сообщение об ошибке нет основного класса ??   -  person    schedule 22.03.2016
comment
main не может вернуть String; более конкретно, main не может возвращать String и быть точкой входа для Java. Подпись точки входа Java не является предложением.   -  person Elliott Frisch    schedule 22.03.2016


Ответы (2)


Я все еще не уверен, хотите ли вы SHA-1 или SHA-256, так что давайте абстрагируемся от проблемы; во-первых, метод encode, который принимает byte[] и возвращает шестнадцатеричный код (не волнуйтесь, вы уже написали его, но я бы предпочел конкатенацию StringBuilder, а не String. 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 или хэш SHA-256, например

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

Какие результаты (как и ожидалось)

da39a3ee5e6b4b0d3255bfef95601890afd80709
e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
person Elliott Frisch    schedule 22.03.2016
comment
Я думаю, что функция дайджеста может быть опасной сама по себе, она возвращает строку, даже если алгоритм неизвестен/неверно введен. Если кто-то захочет использовать этот код, я бы рекомендовал не ловить здесь исключения. - person nico; 18.09.2019

Основная точка входа не может возвращать строку. Кроме того, 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));
    }
}

Наконец, как указал Эллиотт, если вы хотите использовать SHA-256, вы должны изменить MessageDigest.getInstance("SHA1"); на MessageDigest.getInstance("SHA256"); Прямо сейчас вы используете SHA-1. Также Эллиот указал, что вы должны использовать StringBuilder в цикле для повышения эффективности.

person Jesús Martín Berlanga    schedule 22.03.2016