Получить совпадающие контрольные суммы между Java и C # - PullRequest
1 голос
/ 21 марта 2019

Я портирую метод, который создает контрольную сумму для файла (в кодировке base64) из приложения C # на Java. В C # это метод:

public static string GetChecksum(byte[] bytes)
{
    using (var stream = new MemoryStream(bytes))
    {
      var sha = new SHA256Managed();
      byte[] checksum = sha.ComputeHash(stream);
      return BitConverter.ToString(checksum).Replace("-", String.Empty);
    }
}

Вот что у меня есть в Java до сих пор, но оно определенно не соответствует значению, возвращенному из C #:

private static String getCheckSum(String base64Data) throws Exception {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(base64Data.getBytes("UTF-8"));
        byte[] enc = md.digest();

        StringBuilder sb = new StringBuilder();
        for (byte b : enc) {
            sb.append(String.format("%02x", b));
        }

        return sb.toString().replace("-", "").toUpperCase();
    }

Я пытался не использовать кодировку в методе getBytes(), я пытался использовать кодировку US-ASCII.

Этого материала нет в моей рубке, и я не знаю, как поступить. Любая помощь приветствуется.

Ответы [ 2 ]

1 голос
/ 21 марта 2019

В Java для декодирования Base64 String у вас есть это (начиная с Java8):

byte[] decodedBytes = Base64.getDecoder().decode(encodedString);
String decodedString = new String(decodedBytes);

от: https://www.baeldung.com/java-base64-encode-and-decode

0 голосов
/ 21 марта 2019

Вы можете использовать библиотеку Guava для вычисления хэша.

String sha256hex = Hashing.sha256()
  .hashString(originalString, StandardCharsets.UTF_8)
  .toString();

В кодеке Apache commons также есть библиотека для вычисления хэша.

String sha256hex = DigestUtils.sha256Hex(originalString);
...