当我直接规范化某些xml时,我得到两个不同的同一个xml文档的哈希,而不是在我执行数字签名时,它还会在对其进行哈希处理之前对xml执行相同的规范化算法?我发现数字签名规范化包括新的行字符'\n'和规范化时的间距字符,而直接算法则没有.
包括新行字符+空格不在规范化规范中吗?我特别关注这个版本http://www.w3.org/TR/2001/REC-xml-c14n-20010315
有谁知道发生了什么?我已经包含了xml doc和代码的两种实现,所以你可以看到.
这真让我感到困惑,我想知道为什么,我错过了一些明显的东西吗?
<root>
<child1>some text</child1>
<child2 attr="1" />
</root>
Run Code Online (Sandbox Code Playgroud)
直接规范化代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Security.Cryptography.Xml;
using System.Security.Cryptography;
using System.IO;
using System.ComponentModel;
namespace XML_SignatureGenerator
{
class XML_C14N
{
private String _filename;
private Boolean isCommented = false;
private XmlDocument xmlDoc = null;
public XML_C14N(String filename)
{
_filename = filename;
xmlDoc = new XmlDocument();
xmlDoc.Load(_filename);
}
//implement this spec http://www.w3.org/TR/2001/REC-xml-c14n-20010315
public String XML_Canonalize(System.Windows.Forms.RichTextBox tb)
{
//create c14n instance and load in xml …Run Code Online (Sandbox Code Playgroud) Windows徽标计划要求unins000.exe由Inno生成的签名.我设计的唯一方法是解压缩安装程序,签名然后再重新打包.是不是有更简单的方法?
我找到了Inno Unpacker,但我不确定如何重新包装它.
我有一个Web应用程序,其中一些数据(不是文件)需要使用PKI私钥进行数字签名.PKI证书和私钥将位于USB Cryptotoken中,当插入USB插槽时,它会将证书注册到浏览器.这减轻了使用证书进行身份验证的痛苦,因为我通过在我的应用程序中进行ssl-renegotiation.
但是,使用证书进行数字签名似乎有点棘手.我可以想到几种方法来做到这一点
CAPICOM - http://en.wikipedia.org/wiki/CAPICOM 这适用于支持CAPICOM的浏览器(例如IE).但是,似乎微软已经停止了这一点.
Mozilla Crypto对象 - https://developer.mozilla.org/en-US/docs/JavaScript_crypto
WebCrypto API - 大多数浏览器尚不支持此功能.
自定义Java Applet或一些可自由开源的JavaApplet控件.
还有其他选择吗?
我试图找出在Web应用程序中执行此操作的常见,方便和安全的方法.
注意:
对不起,我找不到这个问题的最佳标题.以下是我的要求.
我正在研究一个项目,该项目处理不同账户的大量资金交易.系统自动将资金转账到A,B,C等账户,但在此之前,A,B或C中的某个人应该(电子地)批准转账金额.
你认为最好的方法是什么?我希望系统发送一个数字签名的文件(某物的PDF)(?),A,B和C的授权人员应检查并确认数量是否正确.
由于数量很高,我必须确保系统发出的文件没有被篡改,同时我也想确保A,B或C发送的文件(回复)也没有被篡改.实现它的最佳方法是什么?有任何想法吗?
我正在研究一个iOS项目的XML数字签名世界; 我需要验证SAML断言的数字签名.
我一直在阅读有关验证XML签名的很多内容,我想我已经了解了如何使用私钥对摘要进行签名,我可以使用公钥验证它(应该包含在x509证书中)所以我可以确定SAML令牌的来源.
我找到了一个C libray,xmlsec,看起来它有很多我需要的代码来验证签名,并且一直在努力实现它.但是,我无法弄明白.根据我的理解,我很确定我必须使用我的代码编译库.我已经将源代码复制到了我的项目中,但是在编译期间我遇到了关于未定义的内容的错误.
在我花费无数个小时前往这条道路之前,我想我会联系社区,看看是否有人有任何验证xml数字签名的经验,以及他们是否可以深入了解在iOS项目中实现这一点.
对于它的价值,这是我从单点登录服务获得的SAML断言的一小部分:
<?xml version="1.0" encoding="UTF-16"?>
<saml:Assertion ID="oQ2YZuHBspA_f91HM8o3.o6ZZla" IssueInstant="2011-05-06T00:51:40.733Z" Version="2.0" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<saml:Issuer>[...]</saml:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#oQ2YZuHBspA_f91HM8o3.o6ZZla">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>zj4pCHBNMln+28Jq/v1YIScfiuw=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>[...]</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIIDVjCCAj6gAwIBAgIGAS67wkWCMA0GCSqGSIb3[...]7bgf</ds:X509Certificate>
</ds:X509Data>
<ds:KeyValue>
<ds:RSAKeyValue>
<ds:Modulus>[...]</ds:Modulus>
<ds:Exponent>AQAB</ds:Exponent>
</ds:RSAKeyValue>
</ds:KeyValue>
</ds:KeyInfo>
</ds:Signature>
Run Code Online (Sandbox Code Playgroud) 我发布了一个Windows桌面应用程序,其中包含由Verisign Class 3代码签名证书进行数字签名的所有可执行文件.对于绝大多数用户来说,这似乎工作正常.
但是少数用户报告证书无效.他们说它提出了"证书链已处理,但终止于信任提供商不信任的根证书"的消息.这对应于错误代码CERT_E_UNTRUSTEDROOT (0x800B0109).这也是在完全更新的Windows 7机器上报告的.所以我的证书可能是正常的,但Windows有时不相信VeriSign证书.
为什么Windows有时不信任VeriSign?有什么我可以添加到我的安装程序(也签名),这将告诉Windows信任证书?
windows code-signing digital-certificate digital-signature verisign
我正在尝试从我的Java EE程序向需要证书身份验证的主机发送HTTPS请求.我有一个正确的密钥库文件,信任库和导入的CA,两个列表都显示证书在里面.
但是我收到以下错误:
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: KeyUsage does not allow digital signatures
at ...
...
Caused by: sun.security.validator.ValidatorException: KeyUsage does not allow digital signatures
at sun.security.validator.EndEntityChecker.checkTLSServer(EndEntityChecker.java:270)
at sun.security.validator.EndEntityChecker.check(EndEntityChecker.java:141)
at sun.security.validator.Validator.validate(Validator.java:264)
at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326)
at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231)
at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126)
at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1319)
... 29 more
Run Code Online (Sandbox Code Playgroud)
在扩展部分中查看证书内容我看到以下内容:
Extensions:
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 33 87 72 1D 09 2F DF FF 1A A7 D1 C0 E1 CF C5 FA 3.r../..........
0010: A4 19 54 2E ..T.
]
]
#2: ObjectId: 2.16.840.1.113730.1.1 Criticality=false …Run Code Online (Sandbox Code Playgroud) 我需要使用company.pfx 中存储的证书对Application.exe 文件进行签名。所以,我使用了signtool:
signtool.exe sign /p password /f company.pfx /t http://timestamp.verisign.com/scripts/timestamp.dll /v Application.exe
The following certificate was selected:
Issued to: Company, Inc.
Issued by: Thawte Code Signing CA - G2
Expires: Wed Aug 27 02:59:59 2014
SHA1 hash: A2A0BD7C4516BF8C88AECC3A568CE9BB5D63902D
Done Adding Additional Store
Successfully signed and timestamped: App1_old.exe
Number of files successfully Signed: 1
Number of warnings: 0
Number of errors: 0
Run Code Online (Sandbox Code Playgroud)
Signtool 说没有错误。但在数字签名详细信息中,有一条消息“无法验证签名中的证书”。并且没有认证路径。
在“详细信息”中,有一个属性“扩展错误信息”,表示“吊销状态:吊销功能无法检查吊销,因为吊销服务器已离线”。
为了调查这个问题,我在应用程序上使用了 sigcheck(-a key),它显示“已验证:无法为受信任的根颁发机构构建证书链。”
然后我将 pfx 文件导入存储库,看起来证书没问题。
我在 stackoverflow 上搜索了有关我的主题的信息,找到了一些链接,它很有帮助。 …
我想使用我使用密钥工具创建的一对RSA密钥创建一个文件并使用以下命令:
keytool -genkeypair -alias key -keyalg RSA -keysize 2048 -sigalg SHA256withRSA -validity 365 -keystore keystore.jks
我想初始化我的Signature对象,所以我尝试了这个:
PrivateKey privateKey = (PrivateKey) keyStore.getKey(PRIVATE_KEY_ALIAS,privateKeyPassword);
Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
signature.initSign(privateKey);
Run Code Online (Sandbox Code Playgroud)
但我得到了这个例外:
No installed provider supports this key: sun.security.rsa.RSAPrivateCrtKeyImpl
感谢任何帮助!
我需要使用 AADHAR API。基本上,我们正在为我们的医疗保健客户开发一个移动应用程序,并在其中进行患者登记。现在,我们想要使用 OTP 请求进行简单的 AADHAR 身份验证,其中患者将输入他/她的 AADHAR 号码,作为回报,获得一个 OTP,该 OTP 提交到 AADHAR Auth API,一旦身份验证成功,我们将获取患者的 eKYC 详细信息并使用他们在我的应用程序中。
迄今为止所做的研究:我已经经历过
AADHAR OTP 请求 API - https://uidai.gov.in/images/resource/aadhaar_otp_request_api_2_5.pdf
AADHAR 身份验证 API -
https://uidai.gov.in/images/resource/aadhaar_authentication_api_2_5.pdf
基本上我试图使用邮递员调用 OTP 请求和 Auth API,但这不起作用。在探索 API 时,有人提到我们需要<Signature>Digital signature of AUA</Signature>作为请求正文的一部分进行传递,无论是在 Auth 还是 OTP 请求 API 中,如上面的链接所示。然后我们联系了https://www.emudhradigital.com/并获得了.pfx文件格式的测试证书。
现在我陷入了如何使用这个测试证书来调用这些 API 的困境。此外,UIDAI 网站或任何地方都没有给出关于如何使用和集成它们的明确文档。我在做研究时使用了邮递员,但这不起作用。
任何提示或帮助将不胜感激。
谢谢,马亨德拉
authentication digital-signature one-time-password mobile-application aadhaar
java ×2
security ×2
windows ×2
xml ×2
aadhaar ×1
code-signing ×1
cryptography ×1
encryption ×1
inno-setup ×1
ios ×1
openssl ×1
pkcs#7 ×1
pki ×1
signtool ×1
ssl ×1
verisign ×1