2015-03-23 4 views
0

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

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"); 
     } 
    } 
} 

Но я всегда получаю «Подтверждение подписи».

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

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

+0

Это не помогло бы с проблемой общего секретного кодирования, но я бы вообще рекомендовал вам рассмотреть возможность использования библиотеки JWT, например https://bitbucket.org/b_c/jose4j (раскрытие: я написал это). –

ответ

1

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

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

Смежные вопросы