计算字节数组的SHA-1
我正在寻找一种以Java字节数组作为消息获取SHA-1校验和的方法。
我应该使用第三方工具,还是有内置的JVM可以帮助?
关于什么:
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(); }
这是我们用来转换为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); } }
你可以自己做,或者你可以依赖已经certificate可以像Commons Codec一样工作的库。 DigestUtils
类有几种计算哈希的方法。
来自CommonCodec DigestUtils在Digest计算之后实现Hex覆盖,如前所示:
MessageDigest md = MessageDigest.getInstance("SHA-1"); return byteArray2Hex(md.digest(convertme));
应该是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); }
另一个select是使用Spring:
<bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"> <constructor-arg value="256"/> </bean>
在这里阅读更多
HTH
我只是用它来计算一个dex文件中的哈希和,并将其与dex文件中保存的值进行比较。
我知道这个代码不是非常好的风格,但它更多的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); } }
如何使用这个:
公共类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(); } } }