Следующий код NodeJS при запуске (v16.8.0) регистрирует 512
в стандартный вывод.
константное крипто = требуется ("крипто");
const { privateKey } = crypto.generateKeyPairSync ("rsa", {
модульДлина: 4096,
});
const sign = crypto.createSign("RSA-SHA256").update("somestringtosign");
константная подпись = sign.sign(privateKey);
console.log(подпись.длина); // журналы 512
Если я изменю длину модуля на 2048
, тогда 256
входит в стандартный выход.
Думаю, это имеет смысл, поскольку Спецификация RSA говорит: подпись, строка октетов длины k, где k — длина в октетах модуля RSA n
. Таким образом, 256-битный хэш (SHA256), подписанный ключом RSA с модулем 4096 бит, имеет выход 4096 бит (512 байт).
Может ли длина подписи в RS256 быть больше 256, в зависимости от размера используемого ключа RSA? Это «странно» использовать модуль, который длиннее, чем используемая хэш-функция? Я вижу, что различные поставщики удостоверений, которые подписывают JWT, действительно используют модуль 2048 бит, но это может быть совпадением.
(Я заметил, Спецификация IETF для RS256 говорит: С этими алгоритмами ДОЛЖЕН использоваться ключ размером 2048 бит или больше.
так что, по-видимому, модуль 4096 будет разрешен спецификацией`)
ОБНОВИТЬ
Благодаря комментариям и ответам теперь я понимаю, что задал «неправильный» вопрос. Я (ошибочно) ожидал, что длина подписи JWT будет равна длине хэш-дайджеста, созданного алгоритмом хеширования (SHA256). Я путал биты и байты, потому что, например, SHA256 создает дайджест из 256 бит (не байтов).Длина подписи, которую я наблюдал в моем случае, составляла 256 байт (не бит), что, как я теперь понимаю, должно равняться длине модуля открытого ключа (что действительно так, как я смог проверить позже).