Ошибка проверки цифровой подписи - Java - PullRequest
0 голосов
/ 16 мая 2018

Я генерирую цифровую подпись, используя следующие методы с полезной нагрузкой как "hello world"

public String generateSignature(String payload) throws Exception{
        Signature rsa = null;
        rsa = Signature.getInstance("SHA256WithRSA/PSS", new BouncyCastleProvider());
        rsa.initSign(getPrivateKey("Keys/private_key"));
        rsa.update(payload.getBytes(StandardCharsets.UTF_8));
        byte[] signatureBytes = Base64.encodeBase64(rsa.sign());
        String signature = DatatypeConverter.printHexBinary(signatureBytes);
        return signature;
    }

Я проверяю подпись с полезной нагрузкой "hello world" и подписью, которую я получил с помощью метода generateSignatue.

public boolean validateSignature(String payload, String signature) throws Exception {
    Signature sig = Signature.getInstance("SHA256WithRSA/PSS", new BouncyCastleProvider());
    boolean isValid = false;
    sig.initVerify(getPublicKey("Keys/public_key"));                
    sig.update(payload.getBytes(StandardCharsets.UTF_8));
    isValid = sig.verify(Base64.decodeBase64(signature.getBytes("UTF-8")));
    return isValid;
}

Это всегда возвращает isValid как false, в чем ошибка?

Получение открытого ключа и закрытого ключа с функциями ниже (для справки):

public static PublicKey getPublicKey(String filename) throws Exception {
        byte[] keyBytes = Files.readAllBytes(Paths.get(filename));
        X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
        KeyFactory kf = KeyFactory.getInstance("RSA");
        return kf.generatePublic(spec);
    }

public static PrivateKey getPrivateKey(String filename) throws Exception {
    byte[] keyBytes = Files.readAllBytes(Paths.get(filename));
    PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
    KeyFactory kf = KeyFactory.getInstance("RSA");
    return kf.generatePrivate(spec);
}

1 Ответ

0 голосов
/ 16 мая 2018

Я могу сразу увидеть некоторые ошибки:

  • Файл DER содержит сертификаты, а не закрытые ключи. У вас есть опечатка на "Keys/private_key.der"?

  • Ваш код подписи кодирует байты подписи в base64 и hex, но ваш проверочный код декодирует только из base64. Удалите это String signature = DatatypeConverter.printHexBinary(signatureBytes); Вы также можете удалить преобразование base64 и работать в обоих методах с byte[] напрямую

  • В отредактированном коде шестнадцатеричные числа пропали, но вам нужно использовать расшифровку сигнатуры base 64. Кроме того, вы должны убедиться, что вы используете известный хороший кодек base 64, такой как Base64.getEncoder() и Base64.getDecoder().

...