- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
早上好。
我需要在移动设备上生成一个证书,以便稍后发送到服务器。
目的是签署设备的一些独特功能并在服务器上进行检查。
我用的是下面的方法
// Create cert
var publickey="";
publickey=publickey+"-----BEGIN PUBLIC KEY-----\n";
publickey=publickey+"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD2Alder/8ByIu+565IRZS+xB6t";
publickey=publickey+"hJkmlwNy7wMRTX7YysHC9S75wR/FLWFdsjMP+3TElvxsck+A3emsd2TYcJr0s4p7";
publickey=publickey+"5vP8k3Cap39mTXVNLRyaiFZt4ViJTYhsNWtAfS8t8T56FWPxy1prilR0AQHp+Qj5";
publickey=publickey+"VKdp8Rwfik4GrHOGWQIDAQAB\n";
publickey=publickey+"-----END PUBLIC KEY-----";
var privatekey="";
privatekey=privatekey+"-----BEGIN RSA PRIVATE KEY-----\n";
privatekey=privatekey+"MIICXAIBAAKBgQD2Alder/8ByIu+565IRZS+xB6thJkmlwNy7wMRTX7YysHC9S75";
privatekey=privatekey+"wR/FLWFdsjMP+3TElvxsck+A3emsd2TYcJr0s4p75vP8k3Cap39mTXVNLRyaiFZt";
privatekey=privatekey+"4ViJTYhsNWtAfS8t8T56FWPxy1prilR0AQHp+Qj5VKdp8Rwfik4GrHOGWQIDAQAB";
privatekey=privatekey+"AoGAbhYIIPAi7hpfJrOoUuEIOgGrNLzEh/dF7NW2CrUiEUNSR7rOJaddXy/6hSIs";
privatekey=privatekey+"JXfB/gMOvDy/BQzI94uKDiz9uahMcuADhpUJBpDQMP5B1xMwVAxm8MLHEi86Bn3T";
privatekey=privatekey+"W/yaTsa7SYlnMu0TJl1xQFeB9cQS4qZIUgGR44774yIM/V0CQQD92Xz9ojSgcT4m";
privatekey=privatekey+"Hz1ua4jNTBtUPT+Buxr3IZraaXVYKIUiW1dFXiD6BZ0PVFdA8yBTvltoidjv/5zv";
privatekey=privatekey+"7Pm6alHDAkEA+BfZkqBvLXFQtHgxVaj+JMIXei9TWkhtQt9no1IWAZd/vvBDJelE";
privatekey=privatekey+"utOsG824g/I2+mLnYHDFLfH7CBeMz4mJswJAXbRq7zVxN8iVqHzfsGMBnMb7T51M";
privatekey=privatekey+"VBc9XPyKrRVAu8o5WvVcwb59bc2krIP1sYQN6tvZ4j0AV5eD1w0jIi0dAQJBAKQ7";
privatekey=privatekey+"ZZRjEDYM5VgSmNYT4OmEcvY3jf4eI/Y43eqH1HmJSM+lTU4zdYQXy788GAGAvlRS";
privatekey=privatekey+"VMjK3jzkC0H4FQbuDXECQDaFTYpdYkUDeGPX4YTEPBbwMyJygjRDD3X067bgAJ/+";
privatekey=privatekey+"z9pgsAsHhle6aQv09c0t2j+6LPVeFpSvd2u8g9+9U0o=\n";
privatekey=privatekey+"-----END RSA PRIVATE KEY-----";
var rsa = new RSAKey();
rsa.readPrivateKeyFromPEMString(privatekey);
var tbsc = new KJUR.asn1.x509.TBSCertificate();
tbsc.setSerialNumberByParam({'int': 9999});
tbsc.setSignatureAlgByParam({'name': 'SHA256withRSA'});
tbsc.setIssuerByParam({'str': '/C=ES/O=MOBILE-CA'});
tbsc.setNotBeforeByParam({'str': '130501235959Z'});
tbsc.setNotAfterByParam({'str': '230501235959Z'});
tbsc.setSubjectByParam({'str': '/C=ES/CN=SOME'});
tbsc.setSubjectPublicKeyByParam({'rsapem': publickey});
var cert = new KJUR.asn1.x509.Certificate({'tbscertobj': tbsc,
'prvkeyobj': rsa
});
cert.sign();
var x509toServer=cert.getPEMString(); // Send to server
// Generate sign
var xig = new KJUR.crypto.Signature({"alg": "SHA256withRSA"});
xig.init(rsa);
xig.updateString("zzzzttttzzzz");
var xSigVal = xig.sign();
console.log('Sign: ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
console.log(xSigVal);
console.log('++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++');
// Verify sign
var sig = new KJUR.crypto.Signature({"alg": "SHA256withRSA"});
sig.initVerifyByCertificatePEM(cert.getPEMString()); // signer's certificate
sig.updateString(me.getApplication().device_uid);
var isValid = sig.verify(xSigVal)
if (isValid) {
console.log("valid");
} else {
console.log("invalid");
}
上面的代码运行良好,并向我表明签名是有效的。
证书服务器接收消息 (zzzzttttzzzz) 并签名(变量 xSigVal)。
然后生成下一个文件
device.cer 与
-----BEGIN CERTIFICATE-----
MIIBwjCCASugAwIBAgICJw8wDQYJKoZIhvcNAQELBQAwITELMAkGA1UEBhMCRVMx
EjAQBgNVBAoMCU1PQklMRS1DQTAeFw0xMzA1MDEyMzU5NTlaFw0yMzA1MDEyMzU5
NTlaMCwxCzAJBgNVBAYTAkVTMR0wGwYDVQQDDBR1MDIwODg1LXp6enp0dHR0enp6
ejCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA9gJXXq//AciLvueuSEWUvsQe
rYSZJpcDcu8DEU1+2MrBwvUu+cEfxS1hXbIzD/t0xJb8bHJPgN3prHdk2HCa9LOK
e+bz/JNwmqd/Zk11TS0cmohWbeFYiU2IbDVrQH0vLfE+ehVj8ctaa4pUdAEB6fkI
+VSnafEcH4pOBqxzhlkCAwEAATANBgkqhkiG9w0BAQsFAAOBgQCj7lCmpZt4Icej
KyH1fLseEAHACoR/FB8vknaLL3Bk8X4ADOEWGQD3ZL5TdQYRKxpqYz49j2Iu90qc
YfBeLD/WJ8bwBwnWal1n02pFZJWKldlYjhcQ7Z910AsP2oG3A4tsOUMaUSs+Al2+
U+YKn08m09RRubGVDuxboVtdBicK/A==
-----END CERTIFICATE-----
message.txt 与
zzzzttttzzzz
firma.sign with
cbfbaa6f099fafdb9d892a9d2ea7378a66685e429f77e24241e2e5531db9c020829de125467a891504aaa42b174b0d47d6c83e8234fe32918900ba219cd75b024fa21c241a8c8463ffe629a8e3cf094014cb19a70734db8a0f7b856fb60f4cf9425af8982a9404bfaa8a9e09d742160bca588c4464c17467ef2de69d1b0c46d0
服务器端证书返回的信息为
openssl x509 -in c/device.cer -noout -text
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 9999 (0x270f)
Signature Algorithm: sha256WithRSAEncryption
Issuer: C=ES, O=MOBILE-CA
Validity
Not Before: May 1 23:59:59 2013 GMT
Not After : May 1 23:59:59 2023 GMT
Subject: C=ES, CN=u020885-zzzzttttzzzz
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:f6:02:57:5e:af:ff:01:c8:8b:be:e7:ae:48:45:
94:be:c4:1e:ad:84:99:26:97:03:72:ef:03:11:4d:
7e:d8:ca:c1:c2:f5:2e:f9:c1:1f:c5:2d:61:5d:b2:
33:0f:fb:74:c4:96:fc:6c:72:4f:80:dd:e9:ac:77:
64:d8:70:9a:f4:b3:8a:7b:e6:f3:fc:93:70:9a:a7:
7f:66:4d:75:4d:2d:1c:9a:88:56:6d:e1:58:89:4d:
88:6c:35:6b:40:7d:2f:2d:f1:3e:7a:15:63:f1:cb:
5a:6b:8a:54:74:01:01:e9:f9:08:f9:54:a7:69:f1:
1c:1f:8a:4e:06:ac:73:86:59
Exponent: 65537 (0x10001)
Signature Algorithm: sha256WithRSAEncryption
a3:ee:50:a6:a5:9b:78:21:c7:a3:2b:21:f5:7c:bb:1e:10:01:
c0:0a:84:7f:14:1f:2f:92:76:8b:2f:70:64:f1:7e:00:0c:e1:
16:19:00:f7:64:be:53:75:06:11:2b:1a:6a:63:3e:3d:8f:62:
2e:f7:4a:9c:61:f0:5e:2c:3f:d6:27:c6:f0:07:09:d6:6a:5d:
67:d3:6a:45:64:95:8a:95:d9:58:8e:17:10:ed:9f:75:d0:0b:
0f:da:81:b7:03:8b:6c:39:43:1a:51:2b:3e:02:5d:be:53:e6:
0a:9f:4f:26:d3:d4:51:b9:b1:95:0e:ec:5b:a1:5b:5d:06:27:
0a:fc
我用
提取公钥openssl x509 -in c/device.cer -noout -pubkey > c/device.pub.key.cer
和具有 javascript (var publickey) 的完全匹配
现在问题来了。如何在服务器端与OpenSSL进行相同的签名验证?
带有签名的文件包含一个十六进制数并尝试过
1 -。 openssl dgst -verify c/device.pub.key.cer -signature firma.sign message.txt
2 -。 openssl dgst -sha256 -verify c/device.pub.key.cer -signature firma.sign message.txt
3 -。 猫 firma.sign | xxd -r -p > firma.s2 openssl dgst -verify c/device.pub.key.cer -signature firma.s2 message.txt
和其他选项,但答案总是:
验证失败
有人可以帮忙吗?
提前致谢和问候。
最佳答案
一些事情...
| base64 -d
对其进行解码。根据您的示例创建和验证 base64 签名的步骤:
创建我们的数据输入文件:
echo "zzzzttttzzzz" > zzzzttttzzzz.txt
当我使用 openssl
签署同一条消息时:
openssl dgst -sha256 -sign private.pem -out zzzzttttzzzz.signature zzzzttttzzzz.txt
但是这个签名是官话,所以我们应该 base64
它给出一个针对 jsrsasign
nÝ^@^Oú^P<...>
然后是base64
签名:
$ base64 zzzzttttzzzz.signature
"bt0AD/oQxZ8EA0+J8HSFaQ4fYPEIj2+Nf1hUd87jHDb8vg/MUxKA/EccxQRCYXiVUg5GxBjj5J/W
ZgHNmXZafl6azhC9kTUTS6zvd+TeOPwKFcOm5+g9Pf5ldOcoIpsqN3Fd1fwxrNPZqiawmWaJZHsX
mwd00RC9xupK8BTiNrc="
为确保我们可以解码并匹配二进制签名:
echo "bt0AD/oQxZ8EA0+J8HSFaQ4fYPEIj2+Nf1hUd87jHDb8vg/MUxKA/EccxQRCYXiVUg5GxBjj5J/WZgHNmXZafl6azhC9kTUTS6zvd+TeOPwKFcOm5+g9Pf5ldOcoIpsqN3Fd1fwxrNPZqiawmWaJZHsXmwd00RC9xupK8BTiNrc=" | base64 -d | diff zzzzttttzzzz.signature -
最后,验证:
openssl dgst -sha256 -verify public.key -signature zzzzttttzzzz.signature zzzzttttzzzz.txt
"Verified OK"
总结
openssl
应该可以正常验证。关于javascript - Jsrsasign。如何验证服务器上的签名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23784444/
我得到了这个printHashKey函数,它运行良好。 fun printHashKey() { try { val info : PackageInfo = packageM
如何使用正确的签名 key 为我的 Android 应用包签名? 最佳答案 我尝试在此处和 this question 中使用多个答案, 但不知何故我收到了这个错误,因为我的 android/app/
我的 gradle 文件中有这个: android { signingConfigs { mySigningConfig { keyAlias 'the
请至少选择一个签名版本以在 Android Studio 2.3 中使用 现在在 Android Studio 中生成一个签名的 APK 时,它显示了两个选项(复选框),即 1. V1(Jar 签名)
我想表示一些标量值(例如整数或字符串)通过它的实际值或一些 NA 值,然后存储它们在集合中(例如列表)。目的是处理缺失值。 为此,我实现了一个签名 module type Scalar = sig
为什么这不完全有效? sum :: (Num a, Num b) => a -> b -> c sum a b = a + b 当然,错误消息与签名有关,但我仍然不明白原因。 Couldn't mat
谢谢帮助,我的问题是关于从下面的代码中收到的 ax 值? mov al,22h mov cl,0fdh imul cl 真机结果:ff9a 我的预期:00:9a(通过二进制相乘) 第一个数字是 22h
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我从对物体的思考中得出了一个术语。当我们扩展一个类时,扩展类将具有与父类相同的签名,因此术语 IS-A 来自...示例 class Foo{ } class Foo2 extends Foo{ } c
我需要在有符号整数和它们作为字节序列的内部表示之间进行转换。在 C 中,我使用的函数如下: unsigned char hibyte(unsigned short i) {return i>>8;}
我正在尝试使用给定的 RSA 参数对一些数据进行签名。 我给出了模数、指数、D、DP、DQ、P、Q 和 InverseQ。什么库或方法最容易使用来计算此签名。在 C# 中,一旦您提供参数,它们就会有一
这些签名之间有什么区别? T * f(T & identifier); T & f(T & identifier); T f(T & identifier); void f(T * identifie
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Where and why do I have to put the “template” and “typ
我有一个签名,我需要在签名旁边添加图片。但我不确定 css 的确切程度和内容。目前它显示在文字下方,我应该把图片放在哪里?在相同的 tr 或 td 中?
查看 LinkedHashMap 的 JDK 源代码,我注意到这个类被声明为: public class LinkedHashMap extends HashMap im
背景:我继承了一个基于 linux 的嵌入式系统,其中包含一个 SMTP 代理和一些我不得不忍受的古怪限制。它位于 SMTP 客户端和服务器之间。当 SMTP 客户端连接时,代理会打开与服务器的连接,
这是 C++17 形式的规则 ([basic.lval]/8),但它在其他标准中看起来很相似(在 C++98 中是“lvalue”而不是“glvalue”): 8 If a program attem
我有一个注释: import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.
我即将开展一个项目,希望使用电子签名板使用 C# 捕获客户的签名、在设备上显示文本等。 现在,在我开始做进一步的研究之前,我想向你们征求一些意见/建议,我应该使用哪些设备.. 我现在的要求非常笼统:我
呢喃自己在心中开始扩张地盘,仿佛制式地广播了三次。 漾起的涟绮,用谈不上精腻的手段。 拒绝天亮,却又贪恋着贪恋多情的日光。 川流不息的画面是他们,而我的落幕停在右脚,它渴望着下台,而我只剩自言
我是一名优秀的程序员,十分优秀!