2012-05-15 64 views
1

我目前在使BouncyCastle工作時遇到一些困難。現在已經搜索了幾天,所以我希望你能提供任何有用的見解。服務器端的BouncyCastle以Android手機作爲客戶端

這是設置。使用REST協議,Android客戶端將POST消息發送到服務器。我用代表這些消息的類製作了一個單獨的項目,這樣我就可以將它作爲庫包含在客戶端和服務器上。消息對象首先被解析爲JSON字符串,然後在服務器上解釋。

爲了數據完整性,消息包含數字簽名(DSA)。我問了關於這個問題earlier關於公鑰交換的問題。我得到的答案是有幫助的,因爲這似乎工作正常。

但是,驗證仍然失敗。 Nikolay Elenkov在另一個線索中的回答提到了一個可能的原因:「順便說一句,如果你正在處理單個供應商,它可能會更容易,所以你可能也想在服務器上使用Bouncy Castle。」這是我遇到麻煩的地方(因爲這是一個不同的問題,我爲此做了一個新的話題)

下面是來自消息類(來自公共庫)的代碼摘錄:

import org.bouncycastle.jce.provider.BouncyCastleProvider; 

// .... 

private byte[] signature; 

// .... 

public void sign(DSAPrivateKey key) throws Exception { 
    Security.addProvider(new BouncyCastleProvider()); 
    Signature signer = Signature.getInstance("SHA1withDSA"); 
    signer.initSign(key); 
    signer.update(this.toByteArray()); 
    this.signature = signer.sign(); 
} 

public boolean verifySignature(DSAPublicKey key) throws Exception { 
    Security.addProvider(new BouncyCastleProvider()); 
    Signature signer = Signature.getInstance("SHA1withDSA"); 
    signer.initVerify(key); 
    signer.update(this.toByteArray()); 
    return (signer.verify(this.signature)); 
} 

我包括在每個項目的類路徑的bcprov-jdk15on-147.jar:在客戶端上(不要認爲這是必要的,但誰知道),在協議的項目,並在服務器項目。

服務器似乎不能夠處理它,因爲我得到一個異常顯然是一種常見的BouncyCastle的:

java.lang.NoClassDefFoundError: org/bouncycastle/jce/provider/BouncyCastleProvider 
at java.lang.Class.getDeclaredConstructors0(Native Method) 
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2389) 
at java.lang.Class.getConstructor0(Class.java:2699) 
at java.lang.Class.getDeclaredConstructor(Class.java:1985) 
at com.google.gson.internal.ConstructorConstructor.newDefaultConstructor(ConstructorConstructor.java:82) 
at com.google.gson.internal.ConstructorConstructor.getConstructor(ConstructorConstructor.java:66) 
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:71) 
at com.google.gson.Gson.getAdapter(Gson.java:353) 
at com.google.gson.Gson.fromJson(Gson.java:754) 

下一行作爲gson.fromJson()呼籲消息類。

我應該提到的最後一件事是我正在使用Apache Felix服務器在Mac OS X上工作。如果項目完成,服務器模塊應該可以輕鬆地移植到另一臺機器上。

那麼,我哪裏錯了?感謝您的幫助。

+0

設備上已經有BouncyCastle的版本(可能已經很老了並且已經損壞)。這可能會造成干擾。嘗試重新打包的版本,如[SpongyCastle](https:// github。com/rtyley/spongycastle) - 它基本上只是一個重構的BouncyCastle,它不會干擾設備上的任何破損的POS。 – Jens

回答

0

我不知道Apache Felix的類加載是如何工作的,但是你不應該多次添加提供者。將Security.addProvider(new BouncyCastleProvider());零件移動到JDK的java.security文件中的靜態初始化程序或註冊充氣城堡。

發生什麼樣的異常?你爲什麼在默認構造函數中調用JCE代碼?這可能是一個壞主意,尤其是當使用Gson提供的自動封送處理時。首先構建您的對象,然後調用您擁有的任何驗證代碼。

0

Apache Felix是一個OSGi環境。因此,正確的方法是將必要的BouncyCastle包作爲依賴項添加到您的包中,然後將BouncyCastle JAR作爲Bundle進行安裝。

由於大約一年左右BouncyCastle JAR文件已經是正確的包 - 它們已經在MANIFEST.MF中包含了所有必要的數據。