Как проверить целостность данных с помощью SHA2? - PullRequest
1 голос
/ 21 января 2011
package abc.xyz;
import java.io.UnsupportedEncodingException; 
import java.security.MessageDigest; 
import java.security.NoSuchAlgorithmException; 

public class SHA2{ 

    private static String convertToHex(byte[] data) { 
        StringBuffer buf = new StringBuffer();
        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 SHA2(String text) 
            throws NoSuchAlgorithmException, UnsupportedEncodingException  { 

        MessageDigest mesd;
        mesd = MessageDigest.getInstance("SHA-2");
        byte[] sha2hash = new byte[40];
        mesd.update(text.getBytes("iso-8859-1"), 0, text.length());
        sha2hash = mesd.digest();//error
        return convertToHex(sha2hash);
    } }

Я получаю ошибку при реализации digest ();

Ответы [ 4 ]

4 голосов
/ 21 января 2011

SHA-2 не сам алгоритм.Википедия:

SHA-2 - это набор криптографических хеш-функций (SHA-224, SHA-256, SHA-384, SHA-512)

Я думаю, что всено SHA-224 должен быть доступен.

public static String SHA2(String text) 
    throws NoSuchAlgorithmException, UnsupportedEncodingException  { 

  MessageDigest mesd = MessageDigest.getInstance("SHA-256");
  byte[] bytes = text.getBytes("iso-8859-1");
  mesd.update(bytes, 0, bytes.length);
  byte[] sha2hash = mesd.digest();
  return convertToHex(sha2hash);
} 

Кроме того, создаваемый вами байтовый массив не требуется.Метод digest() возвращает сам массив.Оператор присваивания никогда не записывает результат в существующий массив.Если вы не укажете индекс конечно.

Еще одна вещь.Я бы не использовал text.length () при вызове update(..), так как он не обязательно совпадает с длиной результирующего байтового массива.Это в основном относится к многобайтовому кодированию символов, например UTF-8.Это также может произойти для персонажей, которые не могут быть сопоставлены, в зависимости от выбранной вами стратегии.Ну, главное, хотя: вам не нужно знать, о чем я говорю.Для сохранения просто используйте массив .length:)

2 голосов
/ 21 января 2011

Если вы еще этого не сделали, я бы порекомендовал прочитать документы SUN на JCA , в частности MessageDigest . Если вы посмотрите на поставщиков SUN по умолчанию , вы заметите, что SHA-2 на самом деле не существует, возможно, вместо этого попробуйте SHA-512.

Попробуйте:

String message = "Some Message";

MessageDigest messageDigest = MessageDigest.getInstance("SHA-512");

messageDigest.update(message.getBytes("UTF-16BE"));
byte[] digest = messageDigest.digest();

StringBuffer digestInHex = new StringBuffer();

for (int i = 0, l = digest.length; i < l; i++) {
    // Preserve the bit representation when casting to integer.
    int intRep = digest[i] & 0xFF;
    // Add leading zero if value is less than 0x10.
    if (intRep < 0x10)  digestInHex.append('\u0030');
    // Convert value to hex.
    digestInHex.append(Integer.toHexString(intRep));
}

System.out.println(digestInHex.toString());
2 голосов
/ 21 января 2011

Вам необходимо указать, какой вариант SHA-2 вы хотели бы использовать: SHA-256 или SHA-512.Используйте эти имена в качестве дайджеста.

1 голос
/ 21 января 2011

Какая ошибка? "sha1hash не может быть решен"? Вы пропустили объявление переменной. Нажатие Ctrl-1 в Eclipse делает работу. Что насчет sha2hash? Я бы сказал, что должна быть только одна такая переменная. А как насчет текста и текстовой строки? Еще одна путаница?

Кстати, не существует такой вещи, как "SHA-2". Это семейство функций, содержащее, например, SHA-256. Так что попробуйте что-то вроде этого:

public static byte[] sha2(String text) throws NoSuchAlgorithmException, UnsupportedEncodingException {
    final MessageDigest mesd = MessageDigest.getInstance("SHA-256");
    mesd.update(text.getBytes("iso-8859-1"), 0, text.length());
    return mesd.digest();
}
...