我正在尝试创建如下所示的签名,但收到此错误:
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)
感谢您的帮助 !
我正在尝试使用SHA1签署令牌对象.我使用bouncycastle作为安全提供者.每当程序试图签署某些东西时,它就会给我这个错误.
java.security.SignatureException: java.lang.IllegalArgumentException: input data too large.
Run Code Online (Sandbox Code Playgroud)
签名的最大尺寸是多少?你对我如何签署这个对象有什么建议吗?
我需要找到一些伪造的解决方案,它允许我使用私钥签署一些数据,并使用公钥检查签名.如果有一些nodejs包会很棒.
谢谢!
我正在玩BouncyCastle 1.46令我惊讶的是,下面片段中的陷阱经常被绊倒.
Security.addProvider(new BouncyCastleProvider());
final Set<String> found = new HashSet<String>();
final Set<String> missing = new HashSet<String>();
final DefaultSignatureAlgorithmIdentifierFinder finder = new DefaultSignatureAlgorithmIdentifierFinder();
for (Service service : new BouncyCastleProvider().getServices()) {
if ("Signature".equals(service.getType())) {
final String algorithm = service.getAlgorithm();
try {
finder.find(algorithm);
found.add(algorithm);
} catch (IllegalArgumentException ex) {
missing.add(algorithm);
}
}
}
System.out.println("Found: " + found);
System.out.println("Missing: " + missing);
Run Code Online (Sandbox Code Playgroud)
我似乎无法通过Finder使用大多数算法,即使存在提供这些算法的服务.我究竟做错了什么?
更新我稍微更改了代码以更好地说明问题.可能感兴趣的是我使用的是BouncyCastle的JDK1.5版本.上面的代码给出了这个输出:
实测值:[RIPEMD256WithRSAEncryption,MD5WithRSAEncryption,MD2WithRSAEncryption,SHA384WithRSAEncryption,SHA224WITHECDSA,SHA384WITHDSA,SHA256WITHDSA,SHA512WithRSAEncryption,SHA512WITHDSA,RIPEMD160WithRSAEncryption,SHA224WithRSAEncryption,SHA256WITHECDSA,RIPEMD128WithRSAEncryption,SHA384WITHECDSA,SHA256WithRSAEncryption,SHA512WITHECDSA,SHA1WithRSAEncryption,SHA224WITHDSA]
缺失:[SHA1WITHECNR,NONEwithECDSA,ECDSA,SHA512withRSA/PSS,RIPEMD160WITHECDSA,RSA,GOST3410,SHA256WITHECNR,MD5withRSA/ISO9796-2,SHA1WITHCVC-ECDSA,SHA384withRSA/PSS,SHA1withRSA/PSS,MD4WithRSAEncryption,RSASSA-PSS,SHA512WITHECNR,SHA256WITHCVC-ECDSA ,SHA1withRSA/ISO9796-2,SHA224withRSA/PSS,SHA224WITHCVC-ECDSA,RAWRSASSA-PSS,SHA256withRSA/PSS,NONEWITHDSA,SHA384WITHECNR,RIPEMD160withRSA/ISO9796-2,DSA,ECGOST3410,SHA224WITHECNR,1.2.840.113549.1.1.10]
我在我的数据库中创建了一个用户表,其中包含用于保存用户信息的不同列.我还添加了两列public_key和private_key.当用户注册时,他的信息将被插入到表中.加上我正在使用:
// Create the keypair
$res=openssl_pkey_new();
// Get private key
openssl_pkey_export($res, $privatekey);
// Get public key
$publickey=openssl_pkey_get_details($res);
$publickey=$publickey["key"];
Run Code Online (Sandbox Code Playgroud)
创建一个随机密钥对并将其提供给用户,以便每个用户都有一个密钥对.我希望我的用户具有数字签名功能,因此当他们上传文件时,他们会签名.
我决定首先签署一个示例文件(msg.txt)以查看是否可以然后继续.它看起来很直截了当:
openssl_pkcs7_sign("msg.txt", "signed.txt", "signing_cert.pem",
array("private_key.pem", "mypassphrase"),
array()
);
Run Code Online (Sandbox Code Playgroud)
问题是:sign_cert.pem和private_key.pem是什么?我将生成的公钥粘贴在signing_cert.pem中,将私有密钥粘贴在private_key.pem中,但是我看到了这个错误:
Warning: openssl_pkcs7_sign() [function.openssl-pkcs7-sign]: error getting
private key in /home/ofathian/public_html/msc/ebook/mine/assymetric-test.php
on line 40
Run Code Online (Sandbox Code Playgroud)
任何意见表示赞赏.
我在NSData类上实现了一个类别方法,它使用SHA-1哈希返回数据的签名,并使用私钥进行后续加密,如下所示:
- (NSData *)signatureWithKey:(SecKeyRef)keyRef {
if (keyRef == NULL) {
return nil;
}
NSData *sha1Digest = [self dataWithSHA1Digest];
size_t maxLength = SecKeyGetBlockSize(keyRef) - 11;
if ([sha1Digest length] > maxLength) {
NSString *reason = [NSString stringWithFormat:@"Digest is too long to sign with this key, max length is %ld and actual length is %ld", maxLength, (unsigned long)[self length]];
NSException *ex = [NSException exceptionWithName:@"BMInvalidArgumentException" reason:reason userInfo:nil];
@throw ex;
}
#if TARGET_OS_IPHONE
OSStatus status = noErr;
uint8_t *plainBuffer = (uint8_t *)[sha1Digest bytes];
size_t plainBufferSize …Run Code Online (Sandbox Code Playgroud) macos encryption-asymmetric digital-signature ios private-key
使用非Microsoft编译器,我已经为Windows编写了一个小应用程序,我想免费赠送或出售一些微不足道的数量(5美元说).该程序不使用注册表,但我想将其作为使用免费工具(例如InnoSetup)创建的安装程序可执行文件(例如MyAppInstall.exe)提供.
从签署Windows EXE文件和其他来源,我的理解如下:
如果我没有签署安装程序,Windows将弹出一个警告对话框,警告用户该发布者未知,并建议他们不要运行该软件.这是不可取的.
如果我使用自我认证密钥对安装程序进行签名,则弹出对话框将至少提供发布者名称而不是"未知".它会说发布商无法验证或发布商不受信任.这可能比被描述为未知的出版商要好一些.
如果我每年向CA 支付约100美元,我可以获得一个代码签名证书,这将允许我提供可以轻松安装的有用的免费软件 - 不会出现可怕和令人反感的对话.
我可以使用OpenSSL的Windows版本来创建自我认证的代码签名密钥.这样我就不必从MS下载安装一个590 MB的SDK文件来获取微软的makecert.exe
Catch 22:我听说的唯一代码签名工具signtool.exe只能通过下载和安装至少590 MB的其他东西(SDK)来获得.
问:有没有替代微软的 signtool.exe
我无法解决这个错误<xs:element ref="ds:Signature"/>.我需要一些帮助.
版权所有(C)Microsoft Corporation.版权所有.架构验证警告:未声明' http://www.w3.org/2000/09/xmldsig#:Signature '元素.第162行,第8位.
警告:无法验证架构.类生成可能会失败或可能产生不正确的结果.
警告:无法生成类,因为找不到具有复杂类型的顶级元素.
XSD
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:ds="http://www.w3.org/2000/09/xmldsig#"
attributeFormDefault="unqualified" elementFormDefault="qualified">
<xs:import namespace="http://www.w3.org/2000/09/xmldsig#"
schemaLocation="http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/xmldsig-core-schema.xsd"/>
<xs:complexType name="SobreCheques">
<xs:annotation>
<xs:documentation>Definition of the ...</xs:documentation>
</xs:annotation>
<xs:sequence>
...
<xs:element ref="ds:Signature"/>
</xs:sequence>
</xs:complexType>
</xs:schema>
Run Code Online (Sandbox Code Playgroud) java ×3
bouncycastle ×2
cryptography ×2
ecdsa ×2
security ×2
c# ×1
code-signing ×1
ethereum ×1
ios ×1
macos ×1
metamask ×1
node.js ×1
php ×1
pki ×1
private-key ×1
python ×1
sha1 ×1
xml ×1
xsd ×1