Не удалось проверить подпись HTTP-сообщения для OpenAiJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Не удалось проверить подпись HTTP-сообщения для OpenAi

Сообщение Anonymous »

Я реализовал небольшую библиотеку для анализа подписи сообщения HTTP — https://datatracker.ietf.org/doc/html/rfc9421.
В целях тестирования я зашел на веб-сайт, который печатает заголовки HTTP, и выбрал текущий открытый ключ по ссылке на открытый ключ Open Ai: https://chatgpt.com/.well-known/http-me ... -directory.
Когда я пытаюсь проверить подпись с помощью своего кода, я получаю недействительную подпись.
Что не так с тем, как я реализовал код проверки или с тем, как я его тестирую?
Вот более тонкая версия моего кода и модульный тест для его проверки:
mport org.junit.Test;

import java.nio.charset.StandardCharsets;
import java.security.KeyFactory;
import java.security.PublicKey;
import java.security.Signature;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

import static org.junit.Assert.assertTrue;

public class HttpSignatureTest {

@Test
public void openAiSignatureTest() throws Exception {

String signature = "sig1=:5ByQL0qdxM/8+UnfVqyGfyl87abJ12BtJtk3zqfF5UckkfsLo5/a17kcOFc5zL3xHoLpvrNJhifQ86g9u/kdAw==:";
String jwkX = "7F_3jDlxaquwh291MiACkcS3Opq88NksyHiakzS-Y1g"; // OpenAi key
String host = "manytools.org";

String signatureBase = """
"@authority": %s
"@method": GET
"signature-agent": https://chatgpt.com
"@signature-params": ("@authority" "@method" "signature-agent");created=1761218610;keyid="otMqcjr17mGyruktGvJU8oojQTSMHlVm7uO-lrcqbdg";expires=1761222210;nonce="qmwHb46yropxxtDUYBrymM-WzMIGg2oZiYswgyTOpHQduFtOHumCeRu-nMtCtf3wP2IocniC-uxaYHLZOpsXjg";tag="web-bot-auth";alg="ed25519"\
""".formatted(host);

System.out.println("Signature Base: \n" + signatureBase);

// 4. Extract the signature bytes
String sigB64 = signature.substring(signature.indexOf(":") + 1, signature.lastIndexOf(":"));
byte[] sigBytes = Base64.getDecoder().decode(sigB64);

// 5. Build the public key
PublicKey pub = createPublicKey("OKP", "Ed25519", jwkX);

Signature verifier = Signature.getInstance("Ed25519");
verifier.initVerify(pub);
verifier.update(signatureBase.getBytes(StandardCharsets.UTF_8));
boolean valid = verifier.verify(sigBytes);

assertTrue("Signature should be valid", valid);
}
private static PublicKey createPublicKey(String kty, String alg, String x) throws Exception {

if (!"OKP".equalsIgnoreCase(kty) || !"Ed25519".equalsIgnoreCase(alg)) {
throw new IllegalArgumentException("Unsupported kty/alg combination: " + kty + "/" + alg);
}

byte[] xBytes = Base64.getUrlDecoder().decode(x);
byte[] keyBytes;
if (xBytes.length == 32) {
// Wrap raw Ed25519 key in DER-encoded SubjectPublicKeyInfo
keyBytes = new byte[]{
0x30, 0x2a, // SEQUENCE, length 42
0x30, 0x05, // SEQUENCE, length 5
0x06, 0x03, 0x2b, 0x65, 0x70, // OID 1.3.101.112 (Ed25519)
0x03, 0x21, 0x00 // BIT STRING, length 33, unused bits 0
};
byte[] spki = new byte[keyBytes.length + xBytes.length];
System.arraycopy(keyBytes, 0, spki, 0, keyBytes.length);
System.arraycopy(xBytes, 0, spki, keyBytes.length, xBytes.length);
xBytes = spki;
}
KeyFactory kf = KeyFactory.getInstance("Ed25519");
X509EncodedKeySpec spec = new X509EncodedKeySpec(xBytes);
return kf.generatePublic(spec);
}
}


Подробнее здесь: https://stackoverflow.com/questions/797 ... for-openai
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»