如何使用私钥对字符串进行签名
如果我已将私钥作为byte[]
或String
如何使用SHA1withRSA
获取字符串的签名?
我想你说的是你之前知道的密钥对,并希望签署/validation。
请参阅以下代码。
import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.Signature; import sun.misc.BASE64Encoder; public class MainClass { public static void main(String[] args) throws Exception { KeyPair keyPair = getKeyPair(); byte[] data = "test".getBytes("UTF8"); Signature sig = Signature.getInstance("SHA1WithRSA"); sig.initSign(keyPair.getPrivate()); sig.update(data); byte[] signatureBytes = sig.sign(); System.out.println("Signature:" + new BASE64Encoder().encode(signatureBytes)); sig.initVerify(keyPair.getPublic()); sig.update(data); System.out.println(sig.verify(signatureBytes)); } private static KeyPair getKeyPair() throws NoSuchAlgorithmException { KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); kpg.initialize(1024); return kpg.genKeyPair(); } }
在这里,您需要更改方法getKeyPair()以提供已知的密钥对。 您可以从Java密钥库[JKS]加载它。
您不能将任意字节数组作为公钥或私钥。 它们应该是相关的。
首先必须从字节数组创建公钥
byte publicKeyBytes[] = .... your public key in bytes ... KeyFactory keyFactory = KeyFactory.getInstance("RSA"); X509EncodedKeySpec publicKeySpec = new X509EncodedKeySpec(publicKeyBytes)); PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
并在使用publicKey加密后
String data = "... data to be encrypted ...."; String alg = "RSA/ECB/PKCS1Padding"; Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding"); cipher.init(Cipher.ENCRYPT_MODE, publicKey); byte encryptedBytes[] = cipher.doFinal(data.getBytes());
现在只有拥有privateKey的人才能读取您的数据
@rczajka:一个publicKey是一个关键。 您可以使用它来签署只有所有者(拥有privateKey)才能读取的东西。
public static String sign(String samlResponseString, String keystoreFile, String keyStorePassword, String privateKeyPassword, String alias) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException, SignatureException { PrivateKey pkey=getPrivateKey( keystoreFile, keyStorePassword, privateKeyPassword, alias); String signedString = null; Signature signature = Signature.getInstance("SHA256withRSA"); signature.initSign(pkey); signature.update(samlResponseString.getBytes()); byte[] signatureBytes = signature.sign(); byte[] encryptedByteValue = Base64.encodeBase64(signatureBytes); signedString = new String(encryptedByteValue, "UTF-8"); System.out.println(signedString); return signedString; }