привет всем!
накатал вот такой класс
public class KeyPairService {
private final String publicKey;
private final String privateKey;
public KeyPairService() {
try {
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
keyGen.initialize(2048);
KeyPair keyPair = keyGen.generateKeyPair();
this.publicKey = Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded());
this.privateKey = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded());
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException("Error generating key pair", e);
}
}
static public boolean verifyWithPublicKey(String data, String signature, String publicKeyString) {
try {
byte[] decodedPublicKey = Base64.getDecoder().decode(publicKeyString);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(decodedPublicKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(keySpec);
Signature verifySignature = Signature.getInstance("SHA256withRSA");
verifySignature.initVerify(publicKey);
verifySignature.update(data.getBytes());
return verifySignature.verify(signature.getBytes());
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | InvalidKeySpecException e) {
throw new RuntimeException("Error verifying signature with public key", e);
}
}
static public byte[] signWithPrivateKey(String data, String privateKeyString) {
try {
byte[] decodedPrivateKey = Base64.getDecoder().decode(privateKeyString);
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(decodedPrivateKey);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(keySpec);
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initSign(privateKey);
sign.update(data.getBytes());
return sign.sign();
} catch (NoSuchAlgorithmException | InvalidKeyException | SignatureException | InvalidKeySpecException e) {
throw new RuntimeException("Error signing data with private key", e);
}
}
public String getPublicKey() {
return publicKey;
}
public String getPrivateKey() {
return privateKey;
}
}
сделал тест для него
@SpringBootTest
public class KeyPairServiceTest {
@Test
public void testSignAndVerifyJson() {
String jsonString = "Руддщ";
// Получаем открытый и закрытый ключи из сервиса KeyPairService
KeyPairService keyPairService = new KeyPairService();
String publicKey = keyPairService.getPublicKey();
String privateKey = keyPairService.getPrivateKey();
// Преобразуем JSON-строку в URL-кодированные данные
String data = jsonString;
// Подписываем данные с помощью закрытого ключа
byte[] signature = KeyPairService.signWithPrivateKey(data, privateKey);
// Проверяем подпись с помощью открытого ключа
boolean isVerified = KeyPairService.verifyWithPublicKey(data, Base64.getEncoder().encodeToString(signature), publicKey);
// Проверяем, успешна ли верификация
assertTrue(isVerified, "Signature verification failed");
}
}
но он фейлится с ошибкой "подпись длиной 344, а ожидается 256"
в чем может быть проблема? в яве пару дней, так что сильно не бейте коль что