Почему JsonWebSignature с алгоритмом шифрования ECDH каждый раз дает другую подпись? - PullRequest
0 голосов
/ 12 июня 2019

Я хочу отправить запрос в Google FCM, чтобы отправить push-запрос в браузер для отображения уведомления.

Основная цель - подписать полезную нагрузку JWT закрытым ключом, используя алгоритм ECDH с SHA256, чтобы получитьтокен JWT.

Я пытаюсь подписать токен с помощью алгоритма ECDH, но каждый раз получаю подпись с ошибкой для той же полезной нагрузки.

Это снимок моего кода

Заранее спасибо *.. * * 1009 1010

1012

 public static PrivateKey loadPrivateKey(String encodedPrivateKey) throws NoSuchProviderException, NoSuchAlgorithmException, InvalidKeySpecException {
    byte[] decodedPrivateKey = base64Decode(encodedPrivateKey);

    // prime256v1 is NIST P-256
    ECParameterSpec params = ECNamedCurveTable.getParameterSpec("prime256v1");
    ECPrivateKeySpec prvkey = new ECPrivateKeySpec(new BigInteger(decodedPrivateKey), params);
    KeyFactory kf = KeyFactory.getInstance("ECDH");

    return kf.generatePrivate(prvkey);
   }
1014 1016

первая попытка я получил:

1019 * eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJodHRwczovL2ZjbS5nb29nbGVhcGlzLmNvbSIsImV4cCI6MTU2MDM4ODMxOCwic3ViIjoibWFpbHRvOmFkbWluQGV4YW1wbGUuY29tIn0.MpGc0pKvXtDb94Ruq5lkQjqCqxFMkVAwzVervnH90RLArvGHUAZ_kO4VcecLhGfIXTCitBKb5M-EKsYR35IT0A 1021 * The Seconde время я получил: 1023 * eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiJ9.eyJhdWQiOiJodHRwczovL2ZjbS5nb29nbGVhcGlzLmNvbSIsImV4cCI6MTU2MDM4ODMxOCwic3ViIjoibWFpbHRvOmFkbWluQGV4YW1wbGUuY29tIn0.qEW0ci1BnXXUUjkfsQkdReznAyIDEPtygxV3B58Sl8v_gTlh8O4HHGzRtxsqdvL5UIJV06e_UJHYPOUDK_MF9A

Ответы [ 2 ]

1 голос
/ 13 июня 2019

Алгоритм шифрования ECDH использует другое безопасное случайное число для расчета подписи для каждого поколения подписи. Вы можете указать этот безопасный случайный случай, чтобы каждый раз получать одну и ту же подпись. Для вашего случая:

ProviderContext context = new ProviderContext();
context.setSecureRandom(new SecureRandom(SecureRandom.getSeed(0)));
jws.setProviderContext(context);
0 голосов
/ 12 июня 2019

По замыслу цифровая криптографическая подпись должна удовлетворять только следующему условию

Должен быть проверен соответствующим открытым ключом.

Если вы посмотрите на алгоритм генерации подписи Шаг 3, он говорит: Select a cryptographically secure random integer k from [1,n-1]., где n - это порядок кривой (вы можете пока игнорировать этот факт).

Затем вычислите (x1, y1) = k * G, где G - точка генератора эллиптической кривой. Тогда r = x1 mod n. Этот г является частью подписи. Таким образом, при изменении k, r также изменится, следовательно, сигнатура изменится.

Таким образом, для каждого генерирования подписи алгоритм выбирает другой параметр и затем использует его для вычисления подписи. например:

>>> from ecc import curves
>>> curve = curves.P256()
>>> pkey =  0x00c3f7c39a9be2418cd89a732e40d648b09fa0af9e909a4fb6864910144b5cbcdf
>>> s1 = c.sign(b'Hello', pkey)
(37527198291707833181859423619289327687028014812888685671525882103189540525356,7717531609084222009133798505588038563850333231389727023073200992747312618427)
>>> s2 = c.sign(b'Hello', pkey)
(55880701658034823360120047989457771316451459626784083177171213563603884569397,88917360761747520665103257272757357544674490240888454865713640275762122369837)
>>> s1 == s2
False

Каждый раз, когда подпись отличается.

ref:

...