Хеш-код Java SHA-256 не соответствует ожидаемому результату - PullRequest
0 голосов
/ 23 сентября 2018

У меня проблема с проектом, связанным с базовой криптовалютой.Одним из требований является проверка хеша предыдущей строки по сравнению с хешем, указанным в файле.По сути, вы вычислите хеш SHA-256 предыдущей строки, сравните его с предоставленным хешем и сгенерируете исключение, если действительный хеш не был предоставлен.

Однако я получаю сообщение об ошибке, и я сузил ее до фактического хеширующего кода.Насколько я могу судить, я убедился, что файл читается правильно, но как только появляется метод, который преобразует вычисленный хэш byte[] в предоставленный хэш, он находит их не эквивалентными и выдает исключение.Я пытался отладить, но я действительно не уверен, где проблема.

Мой код ниже.Спасибо!

 if (block_line == null && block_hash == "0")
 {
   return true;         //genesis block, special hash
 }
 //remove new lines and tabs
 block_line = block_line.replaceAll("\\r\\n", "");
 byte[] hash = null;
 byte[] file_hash = block_hash.getBytes();

 try
 {
   //create SHA-256 hash of raw line to ensure following hash is correct
   MessageDigest md = MessageDigest.getInstance("SHA-256");
   md.update(block_line.getBytes());
   hash = md.digest();
 }
 catch (NoSuchAlgorithmException nsaex)
 {
   System.err.println("No SHA-256 algorithm found.");
   System.err.println("This generally should not happen...");
   System.exit(1);
 }
 //check if the hash in the file was valid for the line in question
 try
 {
   if (Arrays.equals(hash, file_hash))
   {
     return true;         //file hash is valid
   }
   else
   {
     throw new InvalidDataException(block_hash, 0);
   }
 }
 catch (InvalidDataException ide)
 {
   System.err.println("InvalidDataException: " + ide);
   ide.printStackTrace();
   System.err.println("Quitting...");
   return false;
 }

1 Ответ

0 голосов
/ 23 сентября 2018

Кажется вероятным, что block_hash содержит закодированное *1003* дайджест-значение в шестнадцатеричном формате (или, возможно, основание 64).Используя getBytes, вы просто получаете стандартную кодировку этой строки: она не декодирует шестнадцатеричное число или основание 64. Когда вы сравниваете байтовые массивы, двоичное значение hash сравнивается с двоичным file_hash, содержащим * 1007.* закодировано дайджест.Поэтому сравнение не удастся (если только потому, что дайджесты будут разных размеров).

В следующий раз вставьте оператор журнала или оператор println и распечатайте шестнадцатеричные хеши, чтобы вы могли сравнить их на глаз.

...