Я ищу способ получить контрольную сумму SHA-1 с массивом байтов Java в качестве сообщения.
Должен ли я использовать сторонний инструмент или есть что-то встроенное в JVM, которое может помочь?
Я ищу способ получить контрольную сумму SHA-1 с массивом байтов Java в качестве сообщения.
Должен ли я использовать сторонний инструмент или есть что-то встроенное в 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);
}
}
Вы можете сделать это самостоятельно или можете полагаться на библиотеки, которые, как было доказано, работают как Commons Codec. Класс DigestUtils
имеет несколько методов для вычисления хэшей.
От CommonCodec DigestUtils Внедрение Hex coversion после вычисления Digest, как показано выше:
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);
}
... другой вариант - использовать Spring:
<bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder">
<constructor-arg value="256"/>
</bean>
подробнее здесь
НТН
Я просто использовал это, чтобы вычислить сумму хэша внутри файла dex и сравнить его со значением, которое сохраняется в файле dex.
Я знаю, что этот код hasnt очень хороший стиль, но его больше 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);
}
}
Как об использовании этого:
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();
}
}
}