У меня в настоящее время возникают некоторые трудности с тем, чтобы BouncyCastle работал. Просматривая это на пару дней, я надеюсь, что вы сможете предоставить любую полезную информацию.BouncyCastle на стороне сервера с телефонами Android как клиенты
Вот настройка. Используя REST-протокол, Android-клиент отправляет POST-сообщения на сервер. Я сделал отдельный проект с классами, представляющими эти сообщения, поэтому я могу включить это как библиотеку как на клиента, так и на сервер. Сначала объекты сообщений сначала разбираются в строку JSON, а затем интерпретируются на сервере.
Для обеспечения целостности данных сообщение содержит цифровую подпись (DSA). Я задал вопрос по этому вопросу earlier об обмене открытым ключом. Ответ, который я получил, был полезен, поскольку это, похоже, работает правильно.
Однако проверка не срабатывает. Ответ Николая Еленкова в другой теме упоминает возможную причину: «Кстати, вам, вероятно, будет проще, если вы имеете дело с одним провайдером, так что вы можете захотеть использовать 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() для класс сообщения.
Последнее, что я должен упомянуть, это то, что я работаю над Mac OS X с сервером Apache Felix. При завершении проекта серверный модуль должен быть легко переносимым на другую машину.
Итак, где я иду не так? Спасибо за любую помощь уже.
На устройстве уже есть версия BouncyCastle (которая может быть довольно старой и сломанной). Это может мешать. Попробуйте переупаковенную версию, например [SpongyCastle] (https: // github.com/rtyley/spongycastle) - это в основном просто рефакторинга BouncyCastle, которая не будет мешать тому, что сломанное POS находится на вашем устройстве. – Jens