- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个服务器,它可以用随机点响应客户端。服务器代码
private static void generateKeys() throws InvalidAlgorithmParameterException, NoSuchAlgorithmException {
ECGenParameterSpec ecSpec = new ECGenParameterSpec(SPEC);
KeyPairGenerator g = KeyPairGenerator.getInstance("EC");
g.initialize(ecSpec, new SecureRandom());
KeyPair keypair = g.generateKeyPair();
publicKey = keypair.getPublic();
privateKey = keypair.getPrivate();
}
private static JSONObject getPoints() throws InvalidAlgorithmParameterException, NoSuchAlgorithmException {
if(null == publicKey && null == privateKey)
generateKeys();
JSONObject object = new JSONObject();
String falseSignature = "AAAaaaAAAaaa111AAAaaaAAAaaa111111AAAaaaAAAAAAAAAAAAAAAaaaaaaa111AAAAAAAAAAAAAAAAAaaaaaAAAAAAaaa1";
try {
Signature ecdsaSign = Signature.getInstance(ALGO);
String pub = Base64.getEncoder().encodeToString(publicKey.getEncoded());
List<Point> points = generatePointsList(10);
JSONArray array = new JSONArray();
JSONArray finalArray = array;
points.forEach(
i -> {
try {
ecdsaSign.initSign(privateKey);
JSONObject obj = new JSONObject();
ecdsaSign.update(i.getString().getBytes(StandardCharsets.UTF_8));
byte[] signature = ecdsaSign.sign();
String sig = Base64.getEncoder().encodeToString(signature);
obj.put("signature", sig);
obj.put("point", i.toJson());
finalArray.put(obj);
} catch (SignatureException | InvalidKeyException e) {
e.printStackTrace();
}
}
);
List<Point> falsePoints = generatePointsList(5);
falsePoints.forEach(
i -> {
JSONObject obj = new JSONObject();
obj.put("signature", falseSignature);
obj.put("point", i.toJson());
finalArray.put(obj);
}
);
object.put("publicKey", pub);
object.put("algorithm", ALGO);
array = shuffleJsonArray(finalArray);
object.put("points", array);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
return object;
}
点码:
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public JSONObject toJson(){
JSONObject obj = new JSONObject();
obj.put("x", x);
obj.put("y", y);
return obj;
}
public String getString(){
return String.format("%s%s", x, y);
}
@Override
public String toString() {
return "Point{" +
"x=" + x +
", y=" + y +
'}';
}
结果是一个带有公钥和点数组的 json 及其签名:
{"publicKey":"MFYwEAYHKoZIzj0CAQYFK4EEAAoDQgAEcWZ5gZI6R2GZQhQ78zDWP4O6wkkc968MzrTbnwETYWKvBdAFyJzlfXmn43ISWqtmFqsSeEmUPT1vabpkbJi9SQ==","algorithm":"SHA256withECDSA","points":[{"signature":"MEYCIQC4FytGoPJOspQDHp7yjsglGuHhv16MBctUUy1VgtVznQIhANV+7drv8aXinT7IBT7apaVlIFE9/Gz/UzPRkj+1dUp4","point":{"x":141,"y":33}},{"signature":"AAAaaaAAAaaa111AAAaaaAAAaaa111111AAAaaaAAAAAAAAAAAAAAAaaaaaaa111AAAAAAAAAAAAAAAAAaaaaaAAAAAAaaa1","point":{"x":88,"y":41}},{"signature":"MEUCIQDaCibfFoh9TVSVZVJuOkT/GTssjEFjYoIn0UdHg4wtTAIgf7Pa52udA4UVIWAPdM5m3wnkgo3/LqT8Q/qQs0USMGU=","point":{"x":119,"y":179}}}]
kotlin 上的 Android 客户端代码:
public fun getPoints(){
coroutineScope.launch {
val getPointsInfoDeferred = executeAsync { getPoints()}
try {
_status.value = ServerApiStatus.LOADING
val points = getPointsInfoDeferred.await()
algo = points.algorithm
publicKey = getPubKey(points.publicKey)
_pointsProp.value = points.points.map { ParselableInfo(points.publicKey,
checkPoints(it),
it) }
_status.value = ServerApiStatus.COMPLETED
}catch (e: Exception){
_status.value = ServerApiStatus.ERROR
Log.i("OVERVIEW MODEL", "some exception: ${e.message}")
_pointsProp.value = listOf()
}
}
}
private fun getPubKey(pubkey:String): PublicKey {
val publicKeySpec: EncodedKeySpec = X509EncodedKeySpec(Base64.decode(pubkey, Base64.DEFAULT))
val keyFactory: KeyFactory = KeyFactory.getInstance("EC")
return keyFactory.generatePublic(publicKeySpec)
}
private fun getPointString(x: Int, y: Int): String{
return "$x$y"
}
private fun checkPoints(pointWithSign: PointWithSignature): Boolean{
val sign: Signature = Signature.getInstance(algo)
val point = pointWithSign.point
return try {
val a = String(publicKey.encoded)
sign.initVerify(publicKey)
sign.update(getPointString(point.x, point.y).toByteArray(StandardCharsets.UTF_8))
return sign.verify(pointWithSign.signature.toByteArray(StandardCharsets.UTF_8))
} catch (e: java.lang.Exception) {
false
}
}
因此“sign.initVerify(publicKey)”行导致异常 - 解析公钥错误,即使公钥对象是在函数“getPubKey”中创建的。我不知道我哪里错了。
堆栈跟踪:
java.security.InvalidKeyException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: Error parsing public key
at com.android.org.conscrypt.OpenSSLKey.fromPublicKey(OpenSSLKey.java:251)
at com.android.org.conscrypt.OpenSSLSignature.engineInitVerify(OpenSSLSignature.java:215)
at java.security.Signature$Delegate.init(Signature.java:1354)
at java.security.Signature$Delegate.chooseProvider(Signature.java:1310)
at java.security.Signature$Delegate.engineInitVerify(Signature.java:1374)
at java.security.Signature.initVerify(Signature.java:601)
at com.example.disserclient.overview.OverviewModel.checkPoints(OverviewModel.kt:91)
at com.example.disserclient.overview.OverviewModel.access$checkPoints(OverviewModel.kt:22)
at com.example.disserclient.overview.OverviewModel$getPoints$1.invokeSuspend(OverviewModel.kt:57)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:241)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:214)
at android.app.ActivityThread.main(ActivityThread.java:7076)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:965)
Caused by: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: Error parsing public key
at com.android.org.conscrypt.NativeCrypto.EVP_parse_public_key(Native Method)
at com.android.org.conscrypt.OpenSSLKey.fromPublicKey(OpenSSLKey.java:249)
最佳答案
所以我找到了解决方案。正如@Maarten - 恢复 Monica 建议的那样,我尝试使用 Bouncy caSTLe 提供程序。它有效!在创建 key 对之前的服务器端,我添加了这一行:
Security.insertProviderAt(new BouncyCastleProvider(), 1);
在客户端我做了一些改变:
val keyFactory: KeyFactory = KeyFactory.getInstance("EC", castleProvider)
和
val sign: Signature = Signature.getInstance(points.algorithm, castleProvider)
caSTLeProvider 是来自
的 BouncyCaSTLeProvider'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.64'
另外我忘记了服务器端的 Base64 编码,所以我更改了符号验证:
sign.verify(Base64.decode(pointWithSign.signature, Base64.DEFAULT))
关于java - Android签名initVerify导致异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59438751/
我正在尝试使用 Spark 从 Cassandra 读取数据。 DataFrame rdf = sqlContext.read().option("keyspace", "readypulse
这是代码: void i_log_ (int error, const char * file, int line, const char * fmt, ...) { /* Get erro
我必须调试一个严重依赖 Gtk 的程序。问题是由于某些原因,在使用 GtkWindow 对象时开始出现许多运行时警告。问题是,即使 Gtk 提示严重错误,它也不会因这些错误而中止。我没有代码库的更改历
我正在尝试从已有效编译和链接的程序中检索二进制文件。我已经通过 GL_PROGRAM_BINARY_LENGTH 收到了它的长度。该文档说有两个实例可能会发生 GL_INVALID_OPERATION
我有一个托管在 Azure 环境中的服务。我正在使用控制台应用程序使用该服务。这样做时,我得到了异常: "The requested service, 'http://xxxx-d.yyyy.be/S
我有以下代码,它被 SEGV 信号杀死。使用调试器表明它被 main() 中的第一个 sem_init() 杀死。如果我注释掉第一个 sem_init() ,第二个会导致同样的问题。我试图弄清楚是什么
目前我正在编写一个应用程序(目标 iOS 6,启用 ARC),它使用 JSON 进行数据传输,使用核心数据进行持久存储。 JSON 数据由 PHP 脚本通过 json_encode 从 MySQL 数
我对 Xamarin.Forms 还是很陌生。我在出现的主页上有一个非常简单的功能 async public Task BaseAppearing() { if (UserID
这是我的代码的简化版本。 public class MainActivity extends ActionBarActivity { private ArrayList entry = new Arr
我想弄明白为什么我的两个 Java 库很难很好地协同工作。这是场景: 库 1 有一个类 A,其构造函数如下: public A(Object obj) { /* boilerplate */ } 在以
如果网站不需要身份验证,我的代码可以正常工作,如果需要,则在打印“已创建凭据”后会立即出现 EXC_BAD_ACCESS 错误。我不会发布任何内容,并且此代码是直接从文档中复制的 - 知道出了什么问题
我在使用 NSArray 填充 UITableView 时遇到问题。我确信我正在做一些愚蠢的事情,但我无法弄清楚。当我尝试进行简单的计数时,我得到了 EXC_BAD_ACCESS,我知道这是因为我试图
我在 UITableViewCell 上有一个 UITextField,在另一个单元格上有一个按钮。 我单击 UITextField(出现键盘)。 UITextField 调用了以下方法: - (BO
我有一个应用程序出现间歇性崩溃。崩溃日志显示了一个堆栈跟踪,这对我来说很难破译,因此希望其他人看到了这一点并能为我指出正确的方向。 基本上,应用程序在启动时执行反向地理编码请求,以在标签中显示用户的位
我开发了一个 CGImage,当程序使用以下命令将其显示在屏幕上时它工作正常: [output_view.layer performSelectorOnMainThread:@selector(set
我正在使用新的 EncryptedSharedPreferences以谷歌推荐的方式上课: private fun securePrefs(context: Context): SharedPrefe
我有一个中继器,里面有一些控件,其中一个是文本框。我正在尝试使用 jquery 获取文本框,我的代码如下所示: $("#").click(function (event) {}); 但我总是得到 nu
在以下场景中观察到 TTS 初始化错误,太随机了。 已安装 TTS 引擎,存在语音集,并且可以从辅助功能选项中播放示例 tts。 TTS 初始化在之前初始化和播放的同一设备上随机失败。 在不同的设备(
maven pom.xml org.openjdk.jol jol-core 0.10 Java 类: public class MyObjectData { pr
在不担心冲突的情况下,可以使用 MD5 作为哈希值,字符串长度最多为多少? 这可能是通过为特定字符集中的每个可能的字符串生成 MD5 哈希来计算的,长度不断增加,直到哈希第二次出现(冲突)。没有冲突的
我是一名优秀的程序员,十分优秀!