Я реализовал небольшую библиотеку для анализа подписи сообщения 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
Не удалось проверить подпись HTTP-сообщения для OpenAi ⇐ JAVA
Программисты JAVA общаются здесь
-
Anonymous
1761720541
Anonymous
Я реализовал небольшую библиотеку для анализа подписи сообщения HTTP — https://datatracker.ietf.org/doc/html/rfc9421.
В целях тестирования я зашел на веб-сайт, который печатает заголовки HTTP, и выбрал текущий открытый ключ по ссылке на открытый ключ Open Ai: https://chatgpt.com/.well-known/http-message-signatures-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);
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79797746/failing-to-validate-http-message-signature-for-openai[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия