Статус: Новичок
Группы: Участники
Зарегистрирован: 18.02.2024(UTC) Сообщений: 1
|
Добрый день! Помогите, пожалуйста, решить проблему. Пытаюсь верифицировать JWT, но безуспешно. Код: private boolean verifyJwt(String token, X509Certificate certificate) {
boolean result = false;
String[] parts = token.split("\\.");
byte[] tokenSign = Base64.getDecoder().decode(parts[2].getBytes(StandardCharsets.UTF_8));
String head = parts[0];
String payload = parts[1];
String headWithPayload = head + "." + payload;
try {
Signature signature = Signature.getInstance((certificate).getSigAlgName());
byte[] msgBytes = headWithPayload.getBytes(StandardCharsets.UTF_8);
PublicKey publicKey = certificate.getPublicKey();
signature.initVerify(publicKey);
signature.update(msgBytes);
result = signature.verify(tokenSign);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (InvalidKeyException e) {
e.printStackTrace();
throw new RuntimeException(e);
} catch (SignatureException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return result;
}
private void signJWT(InputStream dataInputStream, OutputStream signOutputStream) throws Exception{
InputStream inputStream = dataInputStream;
String jwt = new BufferedReader(new InputStreamReader(inputStream)).lines().collect(Collectors.joining("\n"));
String[] parts = jwt.split("\\.");
String dataForSign = parts[0] + "." + parts[1];
byte[] dataBytes = dataForSign.getBytes(StandardCharsets.UTF_8);
byte[] finalData = computeDigestWithStream(inputStream, JCP.GOST_DIGEST_2012_256_NAME, "JCSP");
Signature signatureProcessor;
try {
signatureProcessor = Signature.getInstance(this.algorithmSign, this.providerSign);
PrivateKey privateKey = getInnerPrivateKey();
signatureProcessor.initSign(privateKey);
signatureProcessor.update(finalData);
byte[] signData = signatureProcessor.sign();
ByteArrayOutputStream out = new ByteArrayOutputStream();
out.write(signData);
String signature1 = Base64.getUrlEncoder().withoutPadding().encodeToString(out.toByteArray());
String result = parts[0] + "." + parts[1] + "." + signature1;
signOutputStream.write(signature1.getBytes());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (SignatureException e) {
e.printStackTrace();
} catch (NoSuchProviderException e) {
e.printStackTrace();
}
}
private byte[] computeDigestWithStream(InputStream dataSteam, String algName, String provider) throws Exception {
final MessageDigest digest = MessageDigest.getInstance(algName, provider);
final DigestInputStream digestStream = new DigestInputStream(dataSteam, digest);
while (digestStream.available() != 0)
digestStream.read();
return digest.digest();
}
private PrivateKey getInnerPrivateKey() throws KeyStoreException, IOException,
CertificateException, NoSuchAlgorithmException, UnrecoverableKeyException {
String STORE_TYPE = "Aktiv Rutoken";
String storePath = "/opt/cert.keystore";
String alias = "01234567-0123-0123-0123-0123456789012";
String STORE_PASS = "01234567";
final KeyStore keyStore = KeyStore.getInstance(STORE_TYPE);
final File file = new File(storePath);
if (!file.exists()) {
throw new FileNotFoundException("File " + STORE_TYPE + " not found while retrieving private key");
}
keyStore.load(new FileInputStream(file), STORE_PASS.toCharArray());
return (PrivateKey) keyStore.getKey(alias, STORE_PASS.toCharArray());
}
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close