2014-03-19 51 views
1

請問,我在做什麼壞,下面的java和bash的結果不匹配?由java和openssl簽名不匹配

這裏是similar topic。我能夠輕鬆地寫出Java(實際上在那裏討論),但沒有人關心結果。對我而言,兩者的結果都不一樣。

這裏是Java的一部分,我使用(PEM文件是沒有密碼):

Security.addProvider(new BouncyCastleProvider()); 
PEMParser pemParser = new PEMParser(new BufferedReader(new FileReader(pemPath))); 
Object object = pemParser.readObject(); 

JcaPEMKeyConverter converter = new JcaPEMKeyConverter(); 
KeyPair kp = converter.getKeyPair((PEMKeyPair) object); 
PrivateKey privateKey = kp.getPrivate(); 

Signature sig = Signature.getInstance("RSA"); 
sig.initSign(privateKey); 
sig.update(stringToSign.getBytes()); 

byte[] bytes = sig.sign(); 
return new String(Base64.encode(bytes)); //+ close pemParser 

猛砸代碼:

printf $(printf "${string_to_sign}" | openssl rsautl -sign -inkey "${pem_path}" | openssl enc -base64 | awk '{printf "%s", $0}') 
+1

您是否嘗試過'「SHA1withRSA」',而不僅僅是'「RSA」'? RSA本身不是一個簽名算法(或者一個不安全的,最基本的算法)。通常還需要指定填充模式(「SHA1withRSA」'中的PKCS#1 v1.5)和散列算法。 –

+0

感謝您的評論,但使用「RSA」或「SHA1WithRSA」的結果是相同的 - 與openssl相比仍然不同。 :-( – petasick

+0

我把我的評論回來!!!我改變了簽名的原則,現在我使用''RSA/None/PKCS1Padding''用'javax.crypto.Cipher'填充,它終於可以工作了!很多這個踢! – petasick

回答