ИМХО все приведенные выше решения, которые предоставляют фрагменты для удаления начальных нулей, неверны.
byte messageDigest[] = algorithm.digest();
for (int i = 0; i < messageDigest.length; i++) {
hexString.append(Integer.toHexString(0xFF & messageDigest[i]));
}
Согласно этому фрагменту, 8 битов берутся из байтового массива в
итерация, преобразованная в целое число (поскольку функция Integer.toHexString принимает
int как аргумент), а затем это целое число преобразуется в соответствующий хэш
значение. Так, например, если у вас есть 00000001 00000001 в двоичном, в соответствии с
код, переменная hexString будет иметь значение 0x11 в качестве шестнадцатеричного значения, тогда как
правильное значение должно быть 0x0101. Таким образом, при расчете MD5 мы можем получить хэши
длиной <32 байта (из-за пропущенных нулей), которые могут не удовлетворять
криптографически уникальные свойства, которые делает хеш MD5. </p>
Решением проблемы является замена приведенного выше фрагмента кода на
следующий фрагмент:
byte messageDigest[] = algorithm.digest();
for (int i = 0; i < messageDigest.length; i++) {
int temp=0xFF & messageDigest[i];
String s=Integer.toHexString(temp);
if(temp<=0x0F){
s="0"+s;
}
hexString.append(s);
}