Как подписать общий текст с ключом RSA и кодировать с помощью Base64 в Java? - PullRequest
2 голосов
/ 27 декабря 2011

У меня есть следующий код в bash:

signed_request = $(printf "PLAIN TEXT REQUEST" | 
openssl rsautl -sign -inkey "keyfile.pem" | openssl enc -base64 | _chomp )

Обычно этот код принимает простой текст, подписывает его закрытым ключом и кодирует с использованием Base64

Как я могукод с точно такой же функциональностью в Java?

Ответы [ 3 ]

3 голосов
/ 28 декабря 2011

Вы можете использовать API безопасности JDK . Взгляните на этот рабочий образец , надеюсь, он поможет вам начать:

  public static void main(String[] args) throws Exception {
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
    kpg.initialize(1024);
    KeyPair keyPair = kpg.genKeyPair();

    byte[] data = "test".getBytes("UTF8");

    Signature sig = Signature.getInstance("MD5WithRSA");
    sig.initSign(keyPair.getPrivate());
    sig.update(data);
    byte[] signatureBytes = sig.sign();
    System.out.println("Singature:" + new BASE64Encoder().encode(signatureBytes));

    sig.initVerify(keyPair.getPublic());
    sig.update(data);

    System.out.println(sig.verify(signatureBytes));
  }

EDIT: В приведенном выше примере используется внутренний кодер Sun (sun.misc.BASE64Encoder). Лучше всего использовать что-то вроде Base64 из Commons Codec.

2 голосов
/ 28 декабря 2011

Кроме того, вы можете использовать not-Пока-commons-ssl , чтобы получить закрытый ключ из файла и кодировать с помощью org.apache.commons.ssl.Base64. Используя пример Макса:

import java.security.Signature;
import org.apache.commons.ssl.Base64;
import org.apache.commons.ssl.PKCS8Key;

// [...]

PKCS8Key pkcs8 = new PKCS8Key(new FileInputStream("keyfile.pem"),
                              "changeit".toCharArray());

Signature sig = Signature.getInstance("MD5WithRSA");
sig.initSign(pkcs8.getPrivateKey());
sig.update(data);
byte[] signatureBytes = sig.sign();

System.out.println("Singature: " +
                   Base64.encodeBase64String(signatureBytes));
1 голос
/ 06 августа 2013

Я копирую ссылку @Aqua, опубликованную как новый ответ, потому что я думаю, что это НАМНОГО более полезно, чем любой из приведенных ответов. Используйте ЭТО для чтения / записи закрытых / открытых ключей из файлов: http://codeartisan.blogspot.ru/2009/05/public-key-cryptography-in-java.html

Ссылка ничего не говорит о подписании и проверке, но подписать намного проще. Я использовал этот код для подписи:

    Signature signature = Signature.getInstance("SHA256WithRSA");
    signature.initSign(privateKey);

    signature.update("text to sign".getBytes());
    signature.sign();

И для проверки:

    Signature signature = Signature.getInstance("SHA256WithRSA");
    signature.initVerify(publicKey);
    signature.update("text to sign".getBytes);
    signature.verify(signatureMadeEarlier);
...