标签: digital-signature

如何使用 C++ 签署 XML 文档或验证 XML 文档签名?

主语 我需要在 Windows 下使用本机 C++(无 .NET)进行签名/验证,使用私钥进行签名,使用公钥进行验证。

我在 MSDN ( http://msdn.microsoft.com/en-us/library/ms761363(VS.85).aspx )上看到了几个示例,它们演示了如何使用 CSP 签署文档(我不知道这意味着什么)。

对于我的情况,我需要使用二进制数据数组中的“密钥”(使用 DSA 加密算法)......有人可以帮助我吗?

先感谢您。

c++ xml windows security digital-signature

5
推荐指数
1
解决办法
3967
查看次数

数字签名与通过 DH 使用密钥的 HMAC

我正在编写一个大量使用密码学的应用程序。像大多数网络应用程序一样,我的将数据分解为不同类型的消息(即时消息、文件块、视频帧等)——并且必须检查每个消息的真实性,以防止篡改和正确的来源。到目前为止,我能够使用 ECDH 来协商我已经用于 AES 的共享秘密。当然,以后可以使用相同的共享秘密。

我的问题是:在这种情况下,使用 ECDSA 来签署每条消息是否有任何额外的好处,而不是简单地使用 ECDH 与 HMAC 建立的共享秘密?

下面,当我说 M 时,我的意思是加密消息或明文;应该没关系。请更正以下任何错误。

我知道在 ECDSA(或 DSA)中,通常M使用安全散列算法(我目前使用 SHA-2 之一)对消息 ( ) 进行散列处理H(M),然后H(M)使用签名者的私钥对其进行加密。这会产生RS整数(签名)。然后,M、R 和 S 被发送给已经拥有发送者公钥的接收者。 H'(M)计算,并使用R和验证签名S。BouncyCastle 提供了ECDSASigner实现这一点的方法。

在 HMAC 中,需要一个共享机密,我有。然后:(
HMAC(K, M) := H( f2(K) || H(f1(K) || M) ) 感谢您的更正,Pa?lo Ebermann。有关详细信息,请参阅他的回答。)

那么,考虑到 DH/ECDH 安全地协商共享秘密,我是否有理由不使用 HMAC?

相关:为什么NSA为 DSA 而不是 MAC 指定标准算法?仅仅因为它可以是 SHA-2 + AES?

速度在这里很重要,因为我希望我正在制定的这个协议不仅支持现在的文本消息,而且在不久的将来支持大文件和视频帧。因此,我更喜欢使用 HMAC,但要确保我可以达到上述目标。

谢谢你的帮助!

security cryptography digital-signature hmac dsa

5
推荐指数
1
解决办法
5352
查看次数

CertEnroll::CX509Enrollment::InstallResponse: 找不到对象或属性。0x80092004 (-2146885628)

我有这个问题,我为以下内容编写了 C# 代码:

  1. 以编程方式生成 CSR
  2. 将 CSR 提交给 Microsoft 证书服务
  3. 接收证书并保存为 pfx。

该代码运行良好,但不是以编程方式创建 CSR,而是当我使用使用 IIS 创建的 CSR 时,出现上述错误。

请问可能是什么原因?

我能够在 Microsoft 证书服务中创建证书(通过调用CCertRequestClass.Submit方法并可以在颁发的证书中看到它),但我无法安装它。当我调用CX509EnrollmentClass.InstallResponse. 以下是我的 CSR 生成代码:


     private static CCspInformations CreateCSP()
    {
        CCspInformation csp = new CCspInformationClass();
        CCspInformations csps = new CCspInformationsClass();

        string cspAlgorithmName = "Microsoft Enhanced Cryptographic Provider v1.0";

        //  Initialize the csp object using the desired Cryptograhic Service Provider (CSP)
        csp.InitializeFromName(cspAlgorithmName);

        //  Add this CSP object to the CSP collection object
        csps.Add(csp);

        return csps;
    }

    private …
Run Code Online (Sandbox Code Playgroud)

c# certificate digital-signature certenroll

5
推荐指数
1
解决办法
8507
查看次数

XML 多重签名有标准吗?

我已经检查了 W3C 网站上的 XML 签名语法和处理,但是它几乎没有说明多重签名。是否有在单个 xml 文件上创建多重签名的标准或规则?谢谢

示例:(仅考虑相同文件引用)

原始xml

<root>
  <item>
    <name>Apple</name>
    <price>100</price>
  </item>
</root>
Run Code Online (Sandbox Code Playgroud)

首先 A 用信封的签名签名

签名的 XML

<root>
  <item>
    <name>Apple</name>
    <price>100</price>
  </item>
  <Signature>this is Signature signed by A with Ref URL=""</Signature>
</root>
Run Code Online (Sandbox Code Playgroud)

现在,B 想要签署 XML(包含 A 的签名)

B 签名 XML

<root>
  <item>
    <name>Apple</name>
    <price>100</price>
  </item>
  <Signature>Signature A: this is Signature signed by A with Ref URL=""</Signature>
  <Signature>Signature B: this is Signature signed by B with Ref URL=""</Signature>
</root>
Run Code Online (Sandbox Code Playgroud)

然后在验证时,它变得混乱......

对于签名 A,在验证时,它看到

<root>
  <item>
    <name>Apple</name>
    <price>100</price>
  </item>
  <Signature>Signature …
Run Code Online (Sandbox Code Playgroud)

xml security w3c digital-signature

5
推荐指数
1
解决办法
2065
查看次数

使用delphi进行简单的数字签名

我正在寻找一个简单的解决方案来生成一对密钥(公共/私人)加密/散列一个字符串,然后能够检查该字符串是否使用公钥加密/散列。

是否有一个简单的解决方案(CryptoAPI)?

我正在寻找一个起点。

delphi digital-signature

5
推荐指数
1
解决办法
2680
查看次数

在 Python 中验证数字签名的 PDF

我目前正在使用 Python 处理一些 PDF 处理代码。对于这个项目,软件需要能够验证 PDF 是否具有有效的数字签名。到目前为止,在我的搜索中,我发现了一些可以解决问题的 Java API(例如 iText),但在 Python 中却没有。如果有人有以下任何一项的链接,将不胜感激:

  • 我可以用来验证数字签名的 API
  • 关于如何编写自己的代码来验证数字签名的说明/一般指南

其他细节:

  • PDF 的数字证书由 GlobalSign CA for Adob​​e 颁发(如果重要)
  • 此代码最终将在 Google App Engine 上运行

python pdf google-app-engine digital-signature

5
推荐指数
1
解决办法
4054
查看次数

这个 API 签名请求方法安全吗?

我正在认证为我JSON-RPC API和我的当前工作的策略是使用通过发送请求签约POSTSSL

我想知道是否有人可以看到我没有使用以下签名方法考虑的任何漏洞。

客户端和服务器之间的所有通信都是通过POST发送的请求完成的SSLhttpAPI 服务器会直接拒绝不安全的请求。

依赖关系

var uuid = require('node-uuid');
var crypto = require('crypto');
var moment = require('moment');
var MyAPI = require('request-json').newClient('https://api.myappdomain.com');
Run Code Online (Sandbox Code Playgroud)

依赖链接:node-uuid , crypto , moment , request-json

瓦尔斯

var apiVersion = '1.0';
var publicKey = 'MY_PUBLIC_KEY_UUID';
var secretKey = 'MY_SECRET_KEY_UUID';
Run Code Online (Sandbox Code Playgroud)

请求对象

var request = {
    requestID : uuid.v4(),
    apiVersion : apiVersion,
    nonce : uuid.v4(),
    timestamp : moment.utc( new Date() ),
    params : params
}
Run Code Online (Sandbox Code Playgroud)

签名 …

api digital-signature hmac node.js

5
推荐指数
1
解决办法
1197
查看次数

无法使用Apache PDFBOX验证数字签名

我是使用数字签名的新手.在其中一个项目中,我们使用Apache PdfBox处理数字签名的pdf文件.虽然我们可以测试所有功能,但验证已签名的pdf文件是我们无法破解的.我们使用BouncyCastle作为提供者.以下是代码:

//从pdf文件中获取数字签名和签名内容

byte[] signatureAsBytes = pdsignature.getContents(new FileInputStream(this.INPUT_FILE));
byte[] signedContentAsBytes = pdsignature.getSignedContent(new FileInputStream(this.INPUT_FILE));
Run Code Online (Sandbox Code Playgroud)

//数字签名验证

Security.addProvider(new BouncyCastleProvider());
Signature signer = Signature.getInstance("RSA","BC");

//Get PublicKey from p7b file
X509Certificate cert509=null;
File file = new File("C:\\certificate_file.p7b");
FileInputStream fis = new FileInputStream(file);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
Collection c = cf.generateCertificates(fis);
Iterator it = c.iterator();
PublicKey pubkey;

while (it.hasNext()) 
{
   cert509 = (X509Certificate) it.next();
   pubkey = cert509.getPublicKey();
}

boolean VERIFIED=false;
Security.addProvider(new BouncyCastleProvider());
Signature signer = Signature.getInstance("RSA","BC");
PublicKey key=this.getPublicKey(false);
signer.initVerify(key);

List<PDSignature> allsigs = this.PDFDOC.getSignatureDictionaries();
Iterator<PDSignature> i = …
Run Code Online (Sandbox Code Playgroud)

pdf verification bouncycastle digital-signature pdfbox

5
推荐指数
2
解决办法
5097
查看次数

从 RSA 密钥对获取私钥/公钥 base64 表示

我想在 C# 中生成 RSA 密钥对。我能够获取密钥的 xml 字符串,但我需要它们的 base64 表示。这是我的 xml 代码

RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

privateKeyXmlText = rsa.ToXmlString(true);
publicKeyXmlText = rsa.ToXmlString(false);
Run Code Online (Sandbox Code Playgroud)

但我想要的是

privateKeyStr=="MIICITAjBgoqhkiG9w0BDAEDMBUEEKaTCK5mE2MsQANxDAfaJe8CAQoEggH47qb6bFO+a2Fj...";
publicKeyStr == "MIIBKjCB4wYHKoZIzj0CATCB1wIBATAsBgcqhkjOPQEBAiEA/////wAA...";
Run Code Online (Sandbox Code Playgroud)

有任何想法吗?

c# rsa digital-signature

5
推荐指数
1
解决办法
5452
查看次数

在Android上验证数字签名

我正在开发一个需要数字签名html文档的Android应用程序.该文档以JSON格式驻留在DB中.我正在使用我在其他一些SO问题上找到的BASH脚本在本地签署文档:

openssl dgst -sha1 someHTMLDoc.html > hash openssl rsautl -sign -inkey privateKey.pem -keyform PEM -in hash > signature.bin

使用以下代码生成私钥:

openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -pkeyopt rsa_keygen_pubexp:3 -out privateKey.pem 
Run Code Online (Sandbox Code Playgroud)

使用以下公式生成公钥:

openssl pkey -in privateKey.pem -out publicKey.pem -pubout
Run Code Online (Sandbox Code Playgroud)

我想在应用程序中验证Signature.bin中创建的签名以及someHTMLDoc.html中的数据.

我发送html和签名作为JSON对象ex:

{ "data" : "<html><body></body></html>", "signature":"6598 13a9 b12b 21a9 ..... " }
Run Code Online (Sandbox Code Playgroud)

android应用程序将PublicKey保存在共享首选项中,如下所示:

-----BEGIN PUBLIC KEY----- MIIBIDANBgkqhkiG9w0AAAEFAAOCAQ0AvniCAKCAQEAvni/NSEX3Rhx91HkJl85 \nx1noyYET ......

注意那里的"\n"(换行符)(从publicKey.pem复制字符串到Android Gradle Config时自动添加.

好的,经过一切准备,现在的问题.我试图验证密钥没有成功.

我使用以下代码:

private boolean verifySignature(String data, String signature) {
    InputStream is = null;
    try {
        is = new …
Run Code Online (Sandbox Code Playgroud)

java android json digital-signature

5
推荐指数
1
解决办法
4150
查看次数