Calcola SHA-1 dell’array di byte

Sto cercando un modo per ottenere un checksum SHA-1 con un array di byte Java come messaggio.

Devo utilizzare uno strumento di terze parti o c’è qualcosa di integrato nella JVM che può aiutare?

Che dire:

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

Questo è uno snippet di codice che usiamo per convertire in SHA-1 ma prende una String invece di un Byte[] vedi questo javadoc per ulteriori informazioni

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

Puoi farlo da solo o puoi contare su librerie che hanno dimostrato di funzionare come Commons Codec . La class DigestUtils ha diversi metodi per calcolare gli hash ..

Da CommonCodec DigestUtils Implementazione della cover esadecimale dopo il calcolo del digest come mostrato in precedenza:

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

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

… un’altra opzione è usare Spring:

    

leggi di più qui

HTH

Ho appena usato questo per calcolare la sum dell’hash all’interno di un file dex e confrontarlo con il valore che viene salvato nel file dex.

So che questo codice non ha uno stile molto buono ma è più PoC e serve solo per alcune ricerche che non sono critiche dal punto di vista del tempo. che qualcuno possa usarlo!

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

Che ne dici di usare questo:

public class sha1Calcola {

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