java - BouncyCasSTLe 在服务器端,Android 手机作为客户端

标签 java android security bouncycastle java-server

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

这是设置。 Android 客户端使用 REST 协议(protocol)向服务器发送 POST 消息。我制作了一个单独的项目,其中包含代表这些消息的类,以便我可以将其作为客户端和服务器上的库包含在内。消息对象首先被解析为 JSON 字符串,然后在服务器上进行解释。

为了数据完整性,消息包含数字签名(DSA)。我就这个问题提问了earlier关于公钥的交换。我得到的答案很有帮助,因为这似乎工作正常。

但是,验证仍然失败。 Nikolay Elenkov 在另一个线程中的回答提到了一个可能的原因:“顺便说一句,如果您与单个提供商打交道,可能会更容易,因此您可能也想在服务器上使用 Bouncy CaSTLe。”这就是我遇到麻烦的地方(因为这是一个不同的问题,所以我为此创建了一个新主题)

以下是消息类的代码摘录(来自公共(public)库):

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 包含在每个项目的类路径中:在客户端(不认为这是必要的,但谁知道)、在协议(protocol)项目中以及在服务器项目中。

服务器似乎无法处理它,因为我收到了一个对于 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 上工作。如果项目完成,服务器模块应该可以轻松移植到另一台机器。

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

最佳答案

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

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

关于java - BouncyCasSTLe 在服务器端,Android 手机作为客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10601507/

相关文章:

c# - 在哪里可以找到 ECDsaCryptoServiceProvider 类

c# - 在没有代码签名的情况下从文件共享运行 .NET 应用程序

java - docker 运行 nginx 加 jar

java - 是否有用于生成设计模式的 Eclipse 插件

android - 某些安卓设备上的相机访问错误

postgresql - 为什么 PostgreSQL 默认将用户密码存储在 MD5 哈希中不是安全漏洞?

java:如何使用 apache poi 创建数据透视表?

java.util.NoSuchElementException :null(in java. util.StringTokenizer)

javascript - 安装后尝试设置时出现 react 导航错误 - 元素类型无效

javascript - WebView中来自OnClick(来自HTML中的按钮)的Activity中的触发方法