Sto cercando un modo per ottenere un checksum SHA-1 con un array di byte Java come messaggio.Compute SHA-1 dell'array di byte
Devo utilizzare uno strumento di terze parti o c'è qualcosa integrato nella JVM che può aiutare?
Sto cercando un modo per ottenere un checksum SHA-1 con un array di byte Java come messaggio.Compute SHA-1 dell'array di byte
Devo utilizzare uno strumento di terze parti o c'è qualcosa 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();
}
Stavo solo cercando il modo di calcolare lo sha1 - il formato non ha importanza – Mike
@jarnbjo Hai ragione ma l'OP non lo chiedeva. –
@PascalThivent Ma un altro programmatore potrebbe fermarsi e usare questa risposta, incluso l'errore (che in fondo è in parte ciò che riguarda SO). C'è abbastanza indeterminazione dell'hashing così com'è (i documenti come "calcolare questa firma sha-1 con hashing di queste stringhe concatenate", senza menzionare come codificare i caratteri di input e stringificare l'output dell'hash, sono abbastanza comuni). –
Questo un frammento di codice che utilizziamo per convertire in SHA-1, ma prende un String
invece di un Byte[]
vedono 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);
}
}
Se è abbastanza veloce per te, puoi anche usare String.format ("% 02x", b) per convertire i byte in una stringa esadecimale. –
La riga in cui si assegna un nuovo array a 40 byte è inutile; l'oggetto array proviene dalla chiamata md.digest(). Quando assegni il ritorno di quel metodo a sha1hash, cancelli l'array vuoto a 40 byte che hai creato. – MikeB
Inoltre, un digest SHA-1 è 20 byte, non 40 byte. – MikeB
Puoi fai da te o puoi contare su librerie che hanno dimostrato di funzionare come Commons Codec. La classe DigestUtils
ha diversi metodi per calcolare gli hash ..
Da CommonCodec DigestUtils Attuazione della coversion Hex dopo il calcolo 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);
}
Ho appena usato questo per calcolare la somma 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 qualche ricerca che non è tempo critico. 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);
}
}
Come sull'utilizzo di questo:
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();
}
}
}
che stavo cercando la stessa roba. Un modo per calcolare SHA1 in Java. Cosa ottengo? Due risposte Con un sacco di "questo è sbagliato", "questo è orribile". Eppure, le persone che hanno scritto questi commenti, non hanno scritto una "buona" risposta. – Shiki