2014-09-30 43 views
2
的getpublickey

我們移植PHP(Yii框架)到Java(遊戲框架的2.2.x!)和整個這一段代碼來:的Java OpenSSL的核實和

$sign = base64_decode($sign64); 

    // $cert is a string read from a file. 
    $pubkey = openssl_get_publickey($cert); 

    // $data is composed of incoming username data, time, etc. 
    if(openssl_verify("$data", $sign, $pubkey) != 1) { 
     $this->verifies = false; 
    } else { 
     $this->verifies = true; 
    } 
    openssl_free_key($pubkey); 

我已經縮短這個代碼,以便它包含了必需品。
$ data是與GET請求一起發送的字段。
$ sign64是與此GET請求一起發送的另一個字段。它由另一臺服務器提供,並且是驗證發送的數據有效的簽名。
$ cert文件包含字符串「----- BEGIN CERTIFICATE -----」。
所以我必須問,在Java中實現此驗證碼的標準方式是什麼?

具體而言;我們正在使用Play!框架。到目前爲止,我已經完成了以下工作:

String sign = new String(javax.xml.bind.DatatypeConverter.parseBase64Binary(sign64)); 
java.io.FileInputStream filestream = new java.io.FileInputStream(new java.io.File("certificate.crt")); 
java.security.cert.CertificateFactory cf = java.security.cert.CertificateFactory.getInstance("X.509"); 
java.security.cert.Certificate cert = cf.generateCertificate(filestream); 
java.security.PublicKey pubkey = cert.getPublicKey(); 

try 
{ 
    cert.verify(pubkey, sign64); // This seems to be the closest to what I desire... 
} 
catch (...) 
{ 
    // Here I output the error message... 
} 

我最終得到的是一個「NoSuchProviderException」。它顯示了一些與字符串「符號」相同的隱藏文本。我的問題是:我在做一些根本性錯誤? parseBase64Binary是否正確?簽名的方法是否正確?它不應該;因爲我在這裏沒有簽署數據變量。如何在Java/Play中正確執行此操作!框架?

回答

3

問題與下面的代碼解決:(這是爲那些誰擁有了同樣的問題)

import java.security.*; 
// ... 
public static boolean verifySignature(String data, PublicKey key, byte[] signature) throws Exception { 
    Signature signer = Signature.getInstance("SHA1withRSA"); 
    signer.initVerify(key); 
    signer.update(data.getBytes()); 
    return (signer.verify(signature)); 
} 

公鑰在使用中的問題給出的代碼讀取。簽名使用: byte [] sign = java.util.Base64.getDecoder()。decode(sign64);

最大的挑戰是找出使用哪種算法。我從上面的代碼得到了「SHA1withDSA」的例子,很多嘗試過。最終字符串「SHA1withRSA」起作用。它能夠正確驗證我們的數據提供商簽署的數據。

+0

僅供參考:不要在每次調用時調用getInstance,而應該在init中調用一次並緩存該值。 'getInstance'可能會很慢,因爲它執行SPI相關的操作 – RecursiveExceptionException 2018-01-27 17:30:27