Проверка подписи JWT

Я хочу проверить полезную нагрузку JSON для отправителя, используя общий ключ. Я просмотрел несколько сайтов и придумал этот простой код, чтобы просто проверить только подпись.

package com.toyota.com;

import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

public class JWTVerify {
    private final Base64 decoder = new Base64();
    String secret="anandan";
    private final byte[] bsecret=secret.getBytes();
    public static void main(String args[]) throws InvalidKeyException, NoSuchAlgorithmException, SignatureException
    {
        String token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL2p3dC1pZHAuZXhhbXBsZS5jb20iLCJzdWIiOiJtYWlsdG86bWlrZUBleGFtcGxlLmNvbSIsIm5iZiI6MTQyNzEwNjIwNCwiZXhwIjoxNDI3MTA5ODA0LCJpYXQiOjE0MjcxMDYyMDQsImp0aSI6ImlkMTIzNDU2IiwidHlwIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS9yZWdpc3RlciJ9.BlVNHzDHelLyFCFurP72U5uPVrL8ae8EEIIuVCfSZM8";
        String[] pieces = token.split("\\.");
        JWTVerify jwt=new JWTVerify();
        jwt.verifySignature(pieces, "HmacSHA256");

    }
    public void verifySignature(String[] pieces, String algorithm) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
        Mac hmac = Mac.getInstance(algorithm);
        hmac.init(new SecretKeySpec(bsecret, algorithm));
        byte[] sig = hmac.doFinal(new StringBuilder(pieces[0]).append(".").append(pieces[1]).toString().getBytes());
        System.out.println(sig+"\n"+decoder.decodeBase64(pieces[2]));
        if (!MessageDigest.isEqual(sig, decoder.decodeBase64(pieces[2]))) {
            throw new SignatureException("signature verification failed");
        }
    }
}

Но я всегда получаю "Ошибка проверки подписи".

Исключение в потоке "main" java.security.SignatureException: проверка подписи не удалась

Думаю, я что-то упускаю. Я не уверен, куда идти отсюда. Я проверил полезную нагрузку, используя http://kjur.github.io/jsjws/tool_jwt.html. Там нормально работает. Таким образом, ключ и сообщение являются правильными.


person Anandan    schedule 23.03.2015    source источник
comment
На самом деле это не помогло бы с проблемой кодирования общего секрета, но я все же рекомендую вам рассмотреть возможность использования библиотеки JWT, такой как bitbucket.org/b_c/jose4j (раскрытие информации: это написал я).   -  person Brian Campbell    schedule 23.09.2015


Ответы (1)


Если вы используете new byte[] {10, 10, -61, -102}; для значения bsecret, MAC проверит за вас.

Этот инструмент jsjws преобразует строку, используемую для общего секрета, в байты способом, который мне не подходит. не очень понимаю. Что-то вроде шестнадцатеричного декодирования, но оно будет принимать не шестнадцатеричные, такие как «anandan», и по-прежнему подписывать JWT. Я не совсем уверен, почему, но упомянутые выше байты - это то, во что он преобразует «анандан», но это то, что происходит.

person Brian Campbell    schedule 22.09.2015