BouncyCastle的与Android手机作为客户端服务器端(BouncyCastle on t

2019-09-17 06:14发布

我目前具有越来越BouncyCastle的工作有些困难。 现在一直在寻找在这几天的,所以我希望你能提供任何有用的见解。

这里的设置。 使用REST协议中,Android的客户端发送POST-消息发送到服务器。 我做了一个单独的项目,代表类这些消息,这样我可以包括这是在客户端和服务器上的库。 消息对象首先被解析到一个JSON字符串事后解释在服务器上。

用于数据完整性的缘故,一个消息包含一个数字签名(DSA)。 我问这个问题上一个问题前面关于公共密钥的交换。 我得到的答案是有帮助的,因为这似乎正常工作。

然而,验证不断失败。 尼古拉Elenkov在其他线程的回答提到了一个可能的原因:“顺便说一句,它可能会更容易,如果你正在处理一个单一的供应商,所以你可能想在服务器上使用充气城堡一样。” 这是我得到的麻烦(并且由于它是一种不同的问题,我做了一个新的话题了这一点)

下面是从消息级(从公共库)的代码的摘录:

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()调用消息级。

最后一件事我应该提到的是,我的工作在Mac OS X与Apache服务器菲利克斯。 如果该项目完成后,服务器模块应该很容易移植到另一台机器。

所以,我要去哪里错了? 感谢您已经帮忙。

Answer 1:

我不知道的Apache Felix的类加载是如何工作的,但你不应该多次添加提供程序。 移动Security.addProvider(new BouncyCastleProvider()); 部分静态初始化或注册在充气城堡java.security的JDK的文件。

什么类是发生了异常? 你为什么要打电话JCE代码在默认构造方法? 这可能是一个坏主意,使用自动编组尤其是当GSON作为提供。 首先构建你的对象,你有什么验证码呼叫。



Answer 2:

Apache的Felix是一个OSGi环境。 因此,正确的方法是必要的BouncyCastle的包​​作为依赖添加到您的包并安装BouncyCastle的JAR作为捆绑。

由于约一年左右BouncyCastle的JAR文件已经是正确的包 - 他们已经包括在MANIFEST.MF所有必要的数据。



文章来源: BouncyCastle on the server side with Android phones as clients