Используя закодированный PEM, зашифрованный закрытый ключ для подписания сообщения исходно

попробуйте истекший заголовок http: http://en.wikipedia.org/wiki/List_of_HTTP_headers

Возможно, вам придется объединить это с вашим контролем кэша

14
задан Community 23 May 2017 в 12:19
поделиться

2 ответа

Если вы используете BouncyCastle, попробуйте следующее:

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.security.KeyPair;
import java.security.Security;
import java.security.Signature;
import java.util.Arrays;

import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openssl.PEMReader;
import org.bouncycastle.openssl.PasswordFinder;
import org.bouncycastle.util.encoders.Hex;

public class SignatureExample {

    public static void main(String [] args) throws Exception {
        Security.addProvider(new BouncyCastleProvider());

        String message = "hello world";
        File privateKey = new File("private.pem");
        KeyPair keyPair = readKeyPair(privateKey, "password".toCharArray());

        Signature signature = Signature.getInstance("SHA256WithRSAEncryption");
        signature.initSign(keyPair.getPrivate());
        signature.update(message.getBytes());
        byte [] signatureBytes = signature.sign();
        System.out.println(new String(Hex.encode(signatureBytes)));

        Signature verifier = Signature.getInstance("SHA256WithRSAEncryption");
        verifier.initVerify(keyPair.getPublic());
        verifier.update(message.getBytes());
        if (verifier.verify(signatureBytes)) {
            System.out.println("Signature is valid");
        } else {
            System.out.println("Signature is invalid");
        }
    }

    private static KeyPair readKeyPair(File privateKey, char [] keyPassword) throws IOException {
        FileReader fileReader = new FileReader(privateKey);
        PEMReader r = new PEMReader(fileReader, new DefaultPasswordFinder(keyPassword));
        try {
            return (KeyPair) r.readObject();
        } catch (IOException ex) {
            throw new IOException("The private key could not be decrypted", ex);
        } finally {
            r.close();
            fileReader.close();
        }
    }

    private static class DefaultPasswordFinder implements PasswordFinder {

        private final char [] password;

        private DefaultPasswordFinder(char [] password) {
            this.password = password;
        }

        @Override
        public char[] getPassword() {
            return Arrays.copyOf(password, password.length);
        }
    } 
}
20
ответ дан 1 December 2019 в 12:13
поделиться

Команда OpenSSL генерирует пару ключей и кодирует ее в формате PKCS # 1. Если вы не используете шифрование (не предоставили пароль для команды), PEM представляет собой просто DER в кодировке Base64 для PKCS # 1 RSAPrivateKey.

К сожалению, Sun JCE не предоставляет открытый интерфейс для чтения ключ в этом формате. У вас есть 2 варианта:

  1. Импортировать ключ в хранилище ключей, и вы можете прочитать его оттуда. Keytool не позволяет импортировать закрытые ключи. Вы можете найти другие инструменты для этого.

  2. В библиотеке OAuth есть функция, позволяющая справиться с этим. Посмотрите код здесь:

http://oauth.googlecode.com/svn/code/java/core/commons/src/main/java/net/oauth/signature/pem/PKCS1EncodedKeySpec.java

4
ответ дан 1 December 2019 в 12:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: