通过加载包含 RSA 私钥的预创建 .key 文件,只有我注意到,它包含以下数字:
Modulus (private modulus)
Exponent (private exponent)
P (prime exponent)
Q (prime exponent)
DP
DQ
InverseQ
Run Code Online (Sandbox Code Playgroud)
我将密钥文件保存在存储空间非常小的地方(便携式)。我想只保存模数和指数。我知道 P、Q 和 E 对于创建模数和指数是必要的,但是:
问题:
当 PrivateModulus 和 PrivateExponent 足以签名和解密消息时,将所有这些数据保存到 .key 文件的目的是什么?
我已成功将 mupdf 集成到我的项目中。现在我可以浏览pdf,添加新的注释和编辑,但我不知道如何将数字签名嵌入到pdf中。
任何人都可以建议我将数字签名嵌入到 pdf 中的步骤吗?
克隆远程 git 存储库并发出 后git show --show-signature,它表示签名良好。然后我更改了一些文件并测试了相同的命令,它仍然说签名良好。
上面的命令到底检查什么?验证克隆的git的正确方法是什么?开发者的意思是什么?
我正在尝试学习使用 Apache 的 pdfBox 来处理工作中的数字签名文档。在测试过程中,我创建了一个完全空的 pdf 文档。
然后我通过 Adobe reader 使用带有证书的签名功能对文档进行了签名。
我尝试使用 pdfBox 打开、保存和关闭签名文件,而不进行任何修改。但是,一旦我在 Adobe 中打开该文件,这些文件就不再有效。
Adobe 告诉我:“此签名中包含的格式或信息存在错误(支持信息:SigDict/Contents 非法数据)”
由于我没有修改文件的内容,直观上不应该有任何问题,签名应该仍然有效,但事实并非如此,我不知道解决方案是什么(谷歌搜索没有结果)。
我如何创建文档:
@Test
public void createEmptyPDF() throws IOException {
String path = "path to file";
PDDocument document = new PDDocument();
PDPage page = new PDPage();
document.addPage(page);
document.save(path);
document.close();
}
Run Code Online (Sandbox Code Playgroud)
然后我用 adobe 签名并通过以下方式传递:
@Test
public void copySignedDocument() throws IOException {
String path = "path to file";
File file = new File(path);
PDDocument document = PDDocument.load(file);
document.save(file);
document.close();
//just opening and saving the …Run Code Online (Sandbox Code Playgroud) 我想分发一些 PHP 源代码,我需要提供一种方法来验证这些源代码没有被更改。
所以基本上我想对它们进行签名(如果可能的话使用 PHP),然后检查它们的签名(必须使用 PHP,它必须在 Linux 和 Windows 上都工作)。
我一直在挖掘,我发现的是:
如果任何人都可以验证这个过程(或指出更好的过程),那将是一个很大的帮助。
因为我试图给出我现在找到的理论解决方案,但是理论和实践之间应该是有差距的。特别是考虑到我对这个概念还很陌生,并且在安全方面保持稳固对于我的项目来说至关重要。我记得几年前使用苹果的签名过程是一件很痛苦的事,我对自己创建安全解决方案的能力没有信心。
当我使用需要用户身份验证才能使用密钥的 AndroidKeyStore 时,我的应用程序进入无限循环
.setUserAuthenticationRequired(true);
.setUserAuthenticationValidityDurationSeconds(60);
Run Code Online (Sandbox Code Playgroud)
假设使用用户私钥的操作要求设备已解锁,否则UserNotAuthenticatedException生成a。应用程序必须显示设备身份验证屏幕,并且密钥的下次使用才会起作用。
但是,就我而言,总是会强制UserNotAuthenticatedException应用程序显示解锁屏幕。它仅发生在某些设备中。我有两台运行 Android 6.0.1 的 Nexus 5,只有其中一台出现故障。
这是活动的主要代码
KeyPair keyPair;
private void attemptRegisterKey(){
try{
//generate key pair using AndroidKeyStore only once.
if (keyPair != null)
generateKeyPair(alias);
//Sample Signature
Signature sig = Signature.getInstance("SHA256withRSA");
sig.initSign(keyPair.getPrivate());
sig.update("hello".getBytes());
byte signature[] = sig.sign();
}catch (UserNotAuthenticatedException e){
//show Authentication Screen
Intent intent = mKeyguardManager.createConfirmDeviceCredentialIntent(null, null);
startActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);
}
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS) {
// Challenge completed, …Run Code Online (Sandbox Code Playgroud) 我想创建一个 X.509 公钥证书来验证签名,尤其是。JWT 令牌。
我想知道将哪些属性和扩展属性设置为证书上的哪些值以限制其进行 JWT 验证。
不幸的是,X.509 扩展的规范非常冗长。因此,我也非常感谢您对可用的 X.509 扩展、属性及其含义的简要概述。
我正在尝试创建如下所示的签名,但收到此错误:
java.lang.NoSuchFieldError: xmss_SHA256ph
Run Code Online (Sandbox Code Playgroud)
我正在使用 bcprov-jdk15on 和 bcpkix-jdk15on 版本 1.64 和 Java 8。我尝试了各种签名算法,最新的是 SHA1WITHRSA。我还尝试过 SHA256WITHRSA 和 SHA256withECDSA。
你知道我为什么会收到这个错误吗?谢谢。
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
ContentSigner sha1Signer = new JcaContentSignerBuilder(getSignatureAlgorithm()).build(key);
gen.addSignerInfoGenerator(new JcaSignerInfoGeneratorBuilder(new
JcaDigestCalculatorProviderBuilder().build()).build(sha1Signer, cert));
gen.addCertificates(new JcaCertStore(chain));
CMSTypedDataInputStream msg = new CMSTypedDataInputStream(content);
CMSSignedData signedData = gen.generate(msg, false);
signatureBytes = signedData.getEncoded();
Run Code Online (Sandbox Code Playgroud)
堆栈跟踪
java.lang.NoSuchFieldError: xmss_SHA256ph
at org.bouncycastle.operator.DefaultSignatureAlgorithmIdentifierFinder.<clinit>(Unknown Source) ~[bcpkix-jdk15on-1.64.jar:1.64.00.0]
at org.bouncycastle.operator.jcajce.JcaContentSignerBuilder.<init>(Unknown Source) ~[bcpkix-jdk15on-1.64.jar:1.64.00.0]
at com.trovare.document.pki.Signer.sign(Signer.java:162) ~[classes/:na]
at org.apache.pdfbox.pdfwriter.COSWriter.doWriteSignature(COSWriter.java:744) ~[pdfbox-2.0.19.jar:2.0.19]
at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1150) ~[pdfbox-2.0.19.jar:2.0.19]
at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:452) ~[pdfbox-2.0.19.jar:2.0.19]
at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1386) ~[pdfbox-2.0.19.jar:2.0.19]
at org.apache.pdfbox.pdmodel.PDDocument.saveIncremental(PDDocument.java:1392) ~[pdfbox-2.0.19.jar:2.0.19]
at com.trovare.document.pdf.PdfDcoumentSigner.sign(PdfDcoumentSigner.java:167) ~[classes/:na]
at com.trovare.document.DocumentEncryptorApplication.run(DocumentEncryptorApplication.java:62) …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 C# 和内置加密库来验证使用 EC 密钥 + SHA256 创建的签名。这就是我正在做的事情。
我使用 openssl 创建了私钥和相应的证书:
$ openssl ecparam -genkey -name prime256v1 -out ca.key
$ openssl req -x509 -new -SHA256 -nodes -key ca.key -days 36500 -out ca.crt
Run Code Online (Sandbox Code Playgroud)
这是我正在使用的键(不用担心,它们并不重要):
$ cat ca.key
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIHd3OvRV1nEnoDxGzzemX1x8l2rHasWH3L/LflUGg5vloAoGCCqGSM49
AwEHoUQDQgAE7f1xwQL5m/UcN4zL+zsly6V1g3/wNcL5TdCfWt0XfnUfg0x+RsIf
1uerBnhrmhH0cN9o0xfXg5B3hURFlXVuEQ==
-----END EC PRIVATE KEY-----
$ cat ca.crt
-----BEGIN CERTIFICATE-----
MIIB4TCCAYegAwIBAgIUKt0WdaKI2eRXBO2nVk+OF6AZqHMwCgYIKoZIzj0EAwIw
RTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGElu
dGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAgFw0yMDA1MDcxMzM2MTNaGA8yMTIwMDQx
MzEzMzYxM1owRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAf
BgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDBZMBMGByqGSM49AgEGCCqG
SM49AwEHA0IABO39ccEC+Zv1HDeMy/s7JculdYN/8DXC+U3Qn1rdF351H4NMfkbC
H9bnqwZ4a5oR9HDfaNMX14OQd4VERZV1bhGjUzBRMB0GA1UdDgQWBBRGuUmsyB2h
JCXMRTVMRTcdoWZQaDAfBgNVHSMEGDAWgBRGuUmsyB2hJCXMRTVMRTcdoWZQaDAP
BgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0gAMEUCIGG8tQZlh7aJaI34Y7jq
44SmSc/ule9MgjIX+Gg+i5vwAiEA9Jb/304KO4t9OMqFMQeWZXIHdzhDFBwx7FWz
78+UsnY=
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)
然后我有一个包含字符串“Hello”的简单数据文件。然后我使用 openssl 对该文件进行签名,如下所示:
$ openssl dgst -sha256 -sign …Run Code Online (Sandbox Code Playgroud) 我想使用python验证在 MetaMask 中制作的以太坊(ETH)签名。我正在开发一个使用 Flask 作为后端的网站。Javascript 代码向后端发送 POST 请求,其中包含以下 3 个变量:
{'signature': '0x0293cc0d4eb416ca95349b7e63dc9d1c9a7aab4865b5cd6d6f2c36fb1dce12d34a05039aedf0bc64931a439def451bcf313abbcc72e9172f7fd51ecca30b41dd1b', 'nonce': '6875972781', 'adress': '0x3a806c439805d6e0fdd88a4c98682f86a7111789'}
Run Code Online (Sandbox Code Playgroud)
我的目标是验证签名是否包含随机数(随机整数)并且是由公共地址签名的
我使用 javascript 使用以太库来签署随机数
const ethereum = window.ethereum;
const provider = new ethers.providers.Web3Provider(ethereum)
const signer = provider.getSigner()
var signature = await signer.signMessage(nonce);
Run Code Online (Sandbox Code Playgroud)
我尝试了几个 python libraires,但我无法格式化签名、地址和随机数以使其正常工作。这是使用 ECDSA 库进行的不成功尝试:
vk = ecdsa.VerifyingKey.from_string(bytes.fromhex(address), curve=ecdsa.SECP256k1, hashfunc=sha256)
vk.verify(bytes.fromhex(hex(signature)), bytes(nonce, 'utf-8'))
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
ValueError: non-hexadecimal number found in fromhex() arg at position 1
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助 !
ecdsa ×2
java ×2
pdf ×2
pki ×2
adobe ×1
android ×1
bouncycastle ×1
c# ×1
certificate ×1
code-signing ×1
cryptography ×1
encryption ×1
ethereum ×1
git ×1
ios ×1
jwt ×1
metamask ×1
mupdf ×1
openssl ×1
pdfbox ×1
phar ×1
php ×1
python ×1
rsa ×1
x509 ×1