Неверный SHA-256 хеш строки в MessageDigest
В некоторых тестах я использовал библиотеку MessageDigest в Groovy, а иногда эта функция возвращает неправильное значение. Вот мой код ниже:
import java.security.MessageDigest;
String.metaClass.toSHA256 = {
def messageDigest = MessageDigest.getInstance("SHA-256")
messageDigest.update(delegate.getBytes("UTF-8"))
new BigInteger(1, messageDigest.digest()).toString(16).padLeft(40, '0')
}
например - я попытался закодировать в SHA-256 эту строку:
582015-04-23 20:47:112015-04-23 23:59:000020502015-04-23 20:47:11tests-from-api["afoot"]33facafaece3afd353bcbe88637d11b7
Мой метод возвратаcb2814380117cd5621064c1d7512b32e3cb8c8cb2b1f20016f6da763598d738
Но онлайн генераторы возвращаются 0cb2814380117cd5621064c1d7512b32e3cb8c8cb2b1f20016f6da763598d738
он рассчитывает неправильно, как 2 раза в 40 попыток
Не могли бы вы помочь мне, как это исправить?
1 ответ
В начале вам не хватает "0", потому что вы дополняете до 40 символов (предположительно скопировав этот код из чего-то, где хэш должен составлять 40 символов) вместо 64 символов, которые фактически составляют SHA-256 хеш (в шестнадцатеричном виде).
Так что вы можете просто исправить padLeft
код - но лично я бы просто не использовал BigInteger
для шестнадцатеричных преобразований. Это не то, для чего он предназначен - он предназначен для математических операций с большими целыми числами.
Вместо этого используйте один из многих шестнадцатеричных преобразователей в общих служебных библиотеках, которые предназначены именно для преобразования байтовых массивов в шестнадцатеричные, без каких-либо целых чисел. Если вы не хотите использовать библиотеку, в Stack Overflow достаточно кода для преобразования byte[]
в гекс.