2009-10-04 64 views
44

Tôi đang tìm cách nhận được tổng kiểm tra SHA-1 với mảng byte Java làm thông báo.Tính toán SHA-1 của mảng byte

Tôi có nên sử dụng công cụ của bên thứ ba hoặc có thứ gì đó được tích hợp trong JVM có thể trợ giúp không?

+11

tôi đang tìm kiếm những thứ tương tự. Một cách để tính toán SHA1 trong Java. Những gì tôi nhận được? Hai câu trả lời. Với rất nhiều "điều này là sai", "điều này thật khủng khiếp". Tuy nhiên, những người viết những bình luận này, không viết một câu trả lời "tốt". – Shiki

Trả lời

46

gì về:

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

Tôi chỉ tìm cách tính toán sha1 - định dạng không quan trọng – Mike

+1

@jarnbjo Bạn nói đúng nhưng OP không yêu cầu điều đó. –

+7

@PascalThivent Nhưng một lập trình viên khác có thể dừng lại và sử dụng câu trả lời này, bao gồm cả lỗi (sau tất cả những gì SO là về). Có đủ vagueness về băm như nó là (tài liệu như "tính chữ ký này bởi sha-1 băm chuỗi này nối", mà không đề cập đến cách mã hóa các ký tự đầu vào và xâu chuỗi đầu ra băm, là đủ phổ biến). –

9

Đây là một đoạn mã chúng tôi sử dụng để chuyển đổi sang SHA-1 nhưng phải mất một String thay vì một Byte[] thấy javadoc này để biết thêm

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

Nếu nó đủ nhanh cho bạn, bạn cũng có thể sử dụng String.format ("% 02x", b) để chuyển đổi các byte thành chuỗi hex. –

+0

Dòng mà bạn cấp phát một mảng 40 byte mới là vô dụng; đối tượng mảng xuất phát từ cuộc gọi md.digest(). Khi bạn gán trả về phương thức đó cho sha1hash, bạn xóa mảng 40 byte trống mà bạn đã tạo. – MikeB

+0

Hơn nữa, thông báo SHA-1 là 20 byte, không phải 40 byte. – MikeB

8

Bạn có thể tự mình làm hoặc bạn có thể dựa vào các thư viện đã được chứng minh là hoạt động như Commons Codec. Lớp DigestUtils có một số phương pháp để tính toán băm ..

2

Từ CommonCodec DigestUtils Thực hiện các coversion Hex sau khi tính toán Digest như trước:

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

nên 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); 
} 
1

.. tùy chọn .another là sử dụng Spring:

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

đọc thêm here

HTH

+5

Đó là _amazing_ overhead :)) – ruX

0

I Just sử dụng này để tính toán tổng băm bên trong của một tập tin dex và so sánh nó với các giá trị được lưu trong tập tin dex.

tôi biết mã này không có phong cách rất tốt nhưng có nhiều PoC hơn và chỉ cần cho một số nghiên cứu không quan trọng thời gian. ai đó có thể sử dụng nó!

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

Làm thế nào về Sử dụng này:

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

    } 

} 
Các vấn đề liên quan