我們移植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中正確執行此操作!框架?
僅供參考:不要在每次調用時調用getInstance,而應該在init中調用一次並緩存該值。 'getInstance'可能會很慢,因爲它執行SPI相關的操作 – RecursiveExceptionException 2018-01-27 17:30:27