Java 计算字节数组的 SHA-1

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1515489/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 13:43:21  来源:igfitidea点击:

Compute SHA-1 of byte array

javasha1

提问by Mike

I'm looking for a way of getting an SHA-1 checksum with a Java byte array as the message.

我正在寻找一种使用 Java 字节数组作为消息获取 SHA-1 校验和的方法。

Should I use a third party tool or is there something built in to the JVM that can help?

我应该使用第三方工具还是 JVM 中内置的东西可以提供帮助?

采纳答案by Pascal Thivent

What about:

关于什么:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;

public static String SHAsum(byte[] convertme) throws NoSuchAlgorithmException{
    MessageDigest md = MessageDigest.getInstance("SHA-1"); 
    return byteArray2Hex(md.digest(convertme));
}

private static String byteArray2Hex(final byte[] hash) {
    Formatter formatter = new Formatter();
    for (byte b : hash) {
        formatter.format("%02x", b);
    }
    return formatter.toString();
}

回答by non sequitor

This a snippet of code we use to convert to SHA-1 but takes a Stringinstead of a Byte[]see this javadocfor further info

这是我们用来转换为 SHA-1 的代码片段,但需要使用String而不是Byte[]查看此javadoc以获取更多信息

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

        public class DoSHA1 {

            private static String convToHex(byte[] data) {
                StringBuilder buf = new StringBuilder();
                for (int i = 0; i < data.length; i++) {
                    int halfbyte = (data[i] >>> 4) & 0x0F;
                    int two_halfs = 0;
                    do {
                        if ((0 <= halfbyte) && (halfbyte <= 9))
                            buf.append((char) ('0' + halfbyte));
                        else
                            buf.append((char) ('a' + (halfbyte - 10)));
                        halfbyte = data[i] & 0x0F;
                    } while(two_halfs++ < 1);
                }
                return buf.toString();
            }

            public static String SHA1(String text) throws NoSuchAlgorithmException,
UnsupportedEncodingException  {
            MessageDigest md = MessageDigest.getInstance("SHA-1");
            byte[] sha1hash = new byte[40];
            md.update(text.getBytes("iso-8859-1"), 0, text.length());
            sha1hash = md.digest();
            return convToHex(sha1hash);
            }
        }

回答by Jasha

You can do it yourself or you can rely on libraries that have been proven to work like Commons Codec. The DigestUtilsclass has several methods to calculate hashes..

您可以自己完成,也可以依赖已被证明可以像Commons Codec一样工作的库。本DigestUtils类有几个方法来计算哈希值..

回答by loreii

From CommonCodec DigestUtils Implementation the Hex coversion after the Digest calculation as shown before :

从 CommonCodec DigestUtils 实现 Digest 计算后的十六进制覆盖,如前所示:

MessageDigest md = MessageDigest.getInstance("SHA-1"); 
return byteArray2Hex(md.digest(convertme));

should be http://commons.apache.org/codec/apidocs/src-html/org/apache/commons/codec/binary/Hex.html#line.129:

应该是http://commons.apache.org/codec/apidocs/src-html/org/apache/commons/codec/binary/Hex.html#line.129

private static final char[] DIGITS_LOWER = 
   {'0', '1', '2', '3', '4', '5', '6', '7',
    '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

private static final char[] DIGITS_UPPER = 
   {'0', '1', '2', '3', '4', '5', '6', '7',
    '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};

protected static char[] encodeHex(byte[] data, char[] toDigits) {
    int l = data.length;
    char[] out = new char[l << 1];
    // two characters form the hex value.
    for (int i = 0, j = 0; i < l; i++) {
        out[j++] = toDigits[(0xF0 & data[i]) >>> 4];
        out[j++] = toDigits[0x0F & data[i]];
    }
    return out;
}

protected static int toDigit(char ch, int index) throws DecoderException {
    int digit = Character.digit(ch, 16);
    if (digit == -1) {
        throw new DecoderException(
                    "Illegal hexadecimal character " 
            + ch + " at index " + index);
    }
    return digit;
}

public static String exampleSha1(String convertme){
    MessageDigest md = MessageDigest.getInstance("SHA-1"); 
    byte[] encodeHex = md.digest(convertme));
    return new String(encodeHex);
}

回答by OhadR

...another option is to use Spring:

...另一种选择是使用 Spring:

<bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
     <constructor-arg value="256"/>
 </bean>

read more here

在这里阅读更多

HTH

HTH

回答by reox

I Just used this to compute the hash sum inside of a dex file and compare it with the value which is saved in the dex file.

我只是用它来计算 dex 文件内的哈希和,并将其与保存在 dex 文件中的值进行比较。

i know this code hasnt very good style but its more PoC and only needed for some research which isnt time critical. may someone can use it!

我知道这段代码没有很好的风格,但它更多的 PoC 并且只需要一些对时间不敏感的研究。可能有人可以使用它!

class CheckDex{
public boolean checkSHA1(File f) throws IOException, NoSuchAlgorithmException{
    RandomAccessFile raf = new RandomAccessFile(f, "r");
    byte[] sig = new byte[20];
    raf.seek(0xC);
    for(int i = 0; i < 20; i++){
        sig[i] = (byte) raf.readUnsignedByte();
    }

    MessageDigest md = MessageDigest.getInstance("SHA-1"); 

    byte[] code = new byte[(int) (raf.length()-32)];
    for(int i = 0; i < code.length; i++){
        code[i] = (byte) raf.readUnsignedByte();
    }
    byte[] comsig = md.digest(code);

    raf.close();
    return Arrays.equals(sig,comsig);
}
}

回答by Nayan Rath

How about Using This:

如何使用这个:

public class sha1Calculate {

公共类 sha1Calculate {

    public static void main(String[] args)throws Exception
    {
         File file = new File("D:\Android Links.txt");
        String outputTxt= "";
        String hashcode = null;

        try {

            FileInputStream input = new FileInputStream(file);

            ByteArrayOutputStream output = new ByteArrayOutputStream ();
            byte [] buffer = new byte [65536];
            int l;

            while ((l = input.read (buffer)) > 0)
                output.write (buffer, 0, l);

            input.close ();
            output.close ();

            byte [] data = output.toByteArray ();


                MessageDigest digest = MessageDigest.getInstance( "SHA-1" ); 

            byte[] bytes = data;

            digest.update(bytes, 0, bytes.length);
            bytes = digest.digest();

            StringBuilder sb = new StringBuilder();

            for( byte b : bytes )
            {
                sb.append( String.format("%02X", b) );
            }

                System.out.println("Digest(in hex format):: " + sb.toString());


        }catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    }

}