Ошибка проверки ключей Google KMS asymmetri c - PullRequest
1 голос
/ 28 апреля 2020

Я работаю над реализацией сервера OAuth для пользовательских целей и пытался использовать службу KMS Google для подписи / проверки токенов JWT.

Мне удалось создать подпись очень хорошо, проблемы начались с шаг проверки - всегда приводит к ложному (неверный токен). Затем я приступил к упрощению кода, чтобы найти причину, и в итоге получил код, который я не смог упростить еще больше, но все же не сработал. Я основал код на примерах в Документах Google KMS .

export async function sign (message: string): Promise<Buffer> {
    const name = getKeyPath();
    const digest = crypto.createHash('sha512').update(message).digest();

    const [ result ] = await client.asymmetricSign({
        name,
        digest: {
            sha512: digest
        }
    });

    return result.signature as Buffer;
}

export async function verify (message: string, signature: Buffer): Promise<boolean> {
    const publicKey = await getPublicKey();
    const verifier = crypto.createVerify('SHA512');

    verifier.write(message);
    verifier.end();

    return verifier.verify(publicKey, signature);
}

export async function getPublicKey (): Promise<string> {
    const name = getKeyPath();

    const [ publicKey ] = await client.getPublicKey({ name });

    return publicKey.pem;
}

(async () => {
    const message = 'test';
    const signature = await sign(message);
    const valid = await verify(message, signature);

    console.log(message);
    console.log(signature);
    console.log(valid);
})();

Результат:

test
<Buffer 19 a2 89 37 e5 43 78 c8 63 6b 7e 19 28 10 f7 93 ad c0 fa 10 ce 0a 06 2d 79 52 58 9a a4 7c d5 77 1c 99 b2 cb ce 67 e8 93 d6 0e ef b9 f6 95 89 19 4e 28 ... 462 more bytes>
false

1 Ответ

1 голос
/ 28 апреля 2020

О, о-о-о, какие прекрасные сроки. Я нахожусь в процессе переписывания Node.js облачных образцов KMS и потерял solid 2 часа отладки прошлой ночью. Я собираюсь догадаться, что это ключ RSA?

Проблема в том, что Node отбрасывает / игнорирует спецификацию заполнения, что приводит к неудачной проверке. Вы должны заставить его использовать заполнение PSS, создав ключевой объект:

async function verify(message, signatureBuffer) {
  // Get public key
  const [publicKey] = await client.getPublicKey({
    name: 'projects/my-p/locations/.../cryptoKeyVersions/123',
  });

  // Create the verifier. The algorithm must match the algorithm of the key.
  const crypto = require('crypto');
  const verify = crypto.createVerify('sha512');
  verify.update(message);
  verify.end();

  const key = {
    key: publicKey.pem,
    padding: crypto.constants.RSA_PKCS1_PSS_PADDING, // <-- THIS
  };

  const verified = verify.verify(key, signatureBuffer);
  return verified;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...