【问题标题】:BouncyCastle on the server side with Android phones as clients服务器端的 BouncyCastle 以 Android 手机作为客户端
【发布时间】:2012-05-23 00:14:54
【问题描述】:

我目前在让 BouncyCastle 工作时遇到了一些困难。这几天一直在搜索这个,所以我希望你能提供任何有用的见解。

这是设置。使用 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 上工作。如果项目完成,服务器模块应该很容易移植到另一台机器上。

那么,我哪里错了?感谢您的帮助。

【问题讨论】:

  • 设备上已经有一个 BouncyCastle 版本(可能已经很旧并且损坏了)。那可能是干扰。尝试像 SpongyCastle 这样的重新打包版本 - 它基本上只是一个重构的 BouncyCastle,不会干扰您设备上任何损坏的 POS。

标签: java android security bouncycastle java-server


【解决方案1】:

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

发生异常的类是什么?为什么要在默认构造函数中调用 JCE 代码?这可能是个坏主意,尤其是在使用 Gson 提供的自动编组时。首先构造您的对象,然后调用您拥有的任何验证码。

【讨论】:

    【解决方案2】:

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

    大约一年左右以来,BouncyCastle JAR 文件已经是正确的包 - 它们已经在 MANIFEST.MF 中包含所有必要的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 2014-12-10
      • 1970-01-01
      相关资源
      最近更新 更多