2012-05-15 66 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中包含了所有必要的数据。