Я сталкивался с этим вопросом, пытаясь выяснить точно то же самое. Позже я разобрался, как это сделать, поэтому решил опубликовать ответ здесь.
Вещи, которые должны произойти:
- канонизации
- создать дайджест-значение, обычно SHA1 (но может быть и SHA256 среди прочих)
- base64 кодировать его
Часть канонизации была довольно простой, поскольку библиотеки Java сделали это для меня. То, с чем я боролся, было следующим битом, созданием дайджеста, потому что я допустил фатальную ошибку в том, что сгенерированный дайджест SHA1 был SHA1 в HEX-форме. SHA1 составляет 160 бит, то есть 20 байтов, но если вы выведите эти 160 бит в HEX, вы получите 40 символов. Если вы затем закодируете это base64, вы получите совершенно неправильное значение по сравнению с тем, что должно быть в DigestValue.
Вместо этого вы должны сгенерировать дайджест SHA1, а base64 закодировать 20-байтовый вывод. Не пытайтесь выводить 20 байтов в STDOUT, поскольку маловероятно, что он будет читабелен (именно поэтому люди часто выводят эквивалент HEX, так как он является читаемым). Вместо этого просто base64 кодирует 20 байтов, и это ваше DigestValue.