标签: digital-signature

PDF格式的数字签名

我正在尝试使用项目对PDF文件进行数字签名.

当它执行st.Close(); 我得到臭名昭着的"对象引用未设置为对象的实例".

我不知道为什么会发生这种情况,st是一个对象的实例,它在上面使用.这个异常发生在.Close()中,因为我没有源代码,我只能猜测为什么......

我只能这样说:

  1. 原始PDF正在成功阅读.
  2. 正在生成一个空的pdf(我猜.Close()将写入该文件).
  3. 我的证书正在加载,但我不确定这是正确的方法.

这是我如何加载证书:

private void processCert(X509Certificate2 card)
{
    X509CertificateParser cp = new org.bouncycastle.x509.X509CertificateParser(card.RawData);
    chain = new org.bouncycastle.x509.X509Certificate[] { cp.ReadCertificate() };
}
Run Code Online (Sandbox Code Playgroud)

这就是我试图签署PDF的方式.

public string Sign(string SigReason, string SigContact, string SigLocation, bool visible)
{
    string bugLog ="";
    try
    {
        PdfReader reader = new PdfReader(this.inputPDF);

        //Activate MultiSignatures
        PdfStamper st = PdfStamper.CreateSignature(reader, new FileStream(this.outputPDF, FileMode.Create, FileAccess.Write), '\0', null, true);

        FileStream(this.outputPDF, FileMode.Create, FileAccess.Write), '\0'); 

        st.MoreInfo = this.metadata.getMetaData();

        st.XmpMetadata = this.metadata.getStreamedMetaData();

        PdfSignatureAppearance sap = st.SignatureAppearance;

        sap.SetCrypto(this.myCert.Akp, this.myCert.Chain, …
Run Code Online (Sandbox Code Playgroud)

pdf digital-certificate digital-signature

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

使用RSA密钥保护许可证密钥

已经晚了,我累了,而且可能很密集......

我编写了一个我需要保护的应用程序,因此它只能在我生成密钥的机器上运行.我现在正在做的是获取BIOS序列号并从中生成哈希,然后我使用XML RSA私钥加密它.然后我签署XML以确保它不被篡改.我试图打包公钥来解密和验证签名,但每次我尝试执行代码作为不同的用户而不是生成签名的用户我在签名上失败.

我的大多数代码都是根据我发现的示例代码进行修改的,因为我对RSA加密并不像我希望的那样熟悉.下面是我使用的代码以及我认为需要使用的代码才能使其正常工作...

任何反馈都会非常感激,因为我现在很遗憾我正在处理的原始代码就是这样,只要用户启动程序与最初签署文档的程序相同,此代码就可以正常运行...

 CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";
            cspParams.Flags = CspProviderFlags.UseMachineKeyStore;

            // Create a new RSA signing key and save it in the container. 
            RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider(cspParams)
            {
                PersistKeyInCsp = true,
            };
Run Code Online (Sandbox Code Playgroud)

这段代码是我认为我应该做的,但无论我做什么都无法验证签名,无论是同一个用户还是另一个用户......

RSACryptoServiceProvider rsaKey = new RSACryptoServiceProvider();
            //Load the private key from xml file
            XmlDocument xmlPrivateKey = new XmlDocument();
            xmlPrivateKey.Load("KeyPriv.xml");
            rsaKey.FromXmlString(xmlPrivateKey.InnerXml);
Run Code Online (Sandbox Code Playgroud)

我相信这与密钥容器名称有关(在这里请真正的笨蛋请原谅我)我很确定这是导致它在第一种情况下工作并阻止它在第二种情况......

cspParams.KeyContainerName = "XML_DSIG_RSA_KEY";
Run Code Online (Sandbox Code Playgroud)

有没有办法让我在生成应用程序许可证时使用私钥对XML进行签名/加密,然后将公钥放在app目录中并使用它来验证/解密代码?如果我能让签名部分正常工作,我可以删除加密部分.我使用它作为备份来混淆我所关注的许可证代码的来源.

这有什么意义吗?我是一个彻头彻尾的人吗?

感谢任何人都可以帮助我的帮助..

c# rsa digital-signature

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

如何使用PHP对xml文档进行数字签名?

我要将数字签名添加到xml文档并重新创建它们.

我怎样才能做到这一点?我正在使用simplexml来创建xml文档.这些数字签名将由用户上传为.pfx或.p12文件.

这样做有预定义的类吗?

如果没有,至少我想知道哪些细节必须添加到签名的xml文档以及如何从数字签名文件中获取它们?

php xml digital-signature

5
推荐指数
0
解决办法
8705
查看次数

开源库是否应该进行数字签名

始终签署可执行文件(exe,dll,ocx等)是一种很好的做法.另一方面,对于开源项目,可能会考虑忽视所有其他开发人员对项目的贡献.

这对我来说是一个非常道德的困境,我希望从处于类似情况的人或者为开源项目做出贡献的人那里听到更多关于此的意见.

我想请注意,这个问题是针对使用.NET 4用C#编写的开源项目,因此当用户单击可执行文件时,系统会提示他或她发出警告,指出该文件来自不受信任的发布者,如果它没有经过数字签名.

顺便说一下,程序集都已经具有强命名(签名),但它们尚未进行数字签名(即使用Verisign代码签名证书).

.net c# open-source authenticode digital-signature

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

具有多个签名的数字签名PDF到期

上下文

我的总体目标是提供一组PDF,以便用户可以确信文档的来源(即,它们来自他们预期来自的原点).我正在考虑通过在服务器上对PDF进行数字签名来做到这一点.这些签名不会有到期风险,因为服务器可以在更新证书时重新发布新签名的PDF.使用SSL来提供文档是不够的,因为这些文件可以传递给不想/不需要访问服务器的第三方.

问题

出现过期问题是因为其中一些PDF已经有一个或多个数字签名(例如,为法律目的而创建).我的问题是,如果服务器签署PDF,它是否也会确保以前签名的持续有效性,即使它们到期,只要最新的签名有效?

我在理论方面要求更多,虽然我计划使用iText实现我所描述的内容,因此任何关于如何将其用于我的目的的指针也是受欢迎的.

pdf pdf-generation digital-certificate itext digital-signature

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

RSASSA_PKCS1v15_SHA_Signer和PK_SignatureScheme :: KeyTooShort异常

我是第一次使用Crypto ++,我遇到了一些麻烦.为什么这在C#中使用(使用相同的密钥),而不是在Crypto ++中?我将在下面展示我的C#和C++代码.

C#代码(这有效!):

byte[] Modulus = new byte[] { 0xA3, 0x1D, 0x6C, 0xE5, 0xFA, 0x95, 0xFD, 0xE8, 0x90, 0x21, 0xFA, 0xD1, 0x0C, 0x64, 0x19, 0x2B, 0x86, 0x58, 0x9B, 0x17, 0x2B, 0x10, 0x05, 0xB8, 0xD1, 0xF8, 0x4C, 0xEF, 0x53, 0x4C, 0xD5, 0x4E, 0x5C, 0xAE, 0x86, 0xEF, 0x92, 0x7B, 0x90, 0xD1, 0xE0, 0x62, 0xFD, 0x7C, 0x54, 0x55, 0x9E, 0xE0, 0xE7, 0xBE, 0xFA, 0x3F, 0x9E, 0x15, 0x6F, 0x6C, 0x38, 0x4E, 0xAF, 0x07, 0x0C, 0x61, 0xAB, 0x51, 0x5E, 0x23, 0x53, 0x14, …
Run Code Online (Sandbox Code Playgroud)

c++ rsa digital-signature crypto++

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

高效的OAuth2.0服务器/提供商如何运作?

我可能需要为我正在创建的API实现OAuth2.0服务器.此API允许第三方代表用户执行操作.

OAuth2.0有3个电源呼叫.首先,有一个提示用户同意的电话.这会返回一个code.第二个是code交换a的地方access token.最后,access token用于代表用户调用API.

为了实现,我认为第一个调用生成一个随机字符串,作为一个code.在code随后被保存在一个指向当前用户和随机数据库HMAC Key,然后随机数据返回给第三方的code.

当第三方请求时access token,生成另一条随机数据并与之连接code.使用HMAC key步骤1中的字符串对此字符串进行签名,然后返回此签名字符串和签名以及签名以形成access token.

发生API调用时,将从数据库中检索hmac key与提供的对应access_token的内容.access_token使用hmac密钥验证签名.

用户可以通过简单地从他们的授权HMAC密钥列表中删除HMAC密钥来撤销第三方访问.此外,但只是签署随机数据,我可以避免存储每个创建的每个access_token,而是维护一个简短的hmac键列表.

无论如何,这是我第一次尝试思考.令人惊讶的是,关于有效实现OAuth2.0服务器端的信息很少.我宁愿在数据库中保留尽可能少的信息.签署随机数据然后撤销HMAC密钥的优点是我不必存储每个access token授权调用生成的每个单独的数据.

需要思考!必须有一个更好的方法!

编辑:

我不是在寻找实施方案.谢谢你!此外,我假设整个系统将运行HTTPs.另外,我说的是纯OAuth2.0流程,我不是在谈论带有签名和客户端密钥的OAuth1.0.我问如何在OAuth2.0服务器后面设计密码术,该服务器的工作方式与(例如)Google的OAuth2.0流程类似.

security encryption cryptography digital-signature oauth-2.0

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

验证加载的DLL具有有效证书的最安全的方法是什么?

我有一个二进制'api.dll',它使用另一个二进制'helper.dll'.我想使用数字签名验证每个DLL的真实性,但我不确定正确的方法.对于上下文,DLL使用visual studio 2010构建,并通过依赖项选项卡进行链接.链接通过存根helper.lib发生,所以我没有显式调用LoadLibraryapi.dll代码.部分问题是我不知道从哪里加载helper.dll.我最初的想法是:

  1. 掌握当前流程
  2. 枚举所有已加载的模块
  3. 找到名为"helper.dll"的一个(或多个)(如果这个信息通过枚举模块的API可用),并验证它使用的东西签名 是这样

这是解决这个问题的最好方法吗?

其次,基于我对数字签名/证书的模糊理解,在我看来验证需要连接到证书颁发机构,或者证书需要已经在机器上列为可信任.当外部连接被不赞成或明确禁止时,通常如何处理?是应用程序"安装"的东西吗?或者在这种情况下是否需要另一种不太安全的验证方法?

c++ winapi digital-signature

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

XP/Vista上的数字签名时间戳"不可用",导致验证失败

背景

我有一个WiX/Burn安装包,其中包括安装ReportViewer 2012 Runtime.在Windows 7或更高版本的计算机上运行时,它可以正常工作.在XP(SP3)或Vista(SP1)上它失败了.

现在,检查ReportViewer可再发行组件的下载页面,我注意到它说它需要Vista SP2或更高版本.通常我会接受这个,但a)我认为这最近已经改变了,b)下载并手动安装这个可再发行的作品.可能有些部件在XP/Vista上不起作用,但出于我的意图和目的,它安装并运行得很好,尽管他们声称.

问题

检查安装日志文件说明数字签名验证失败.因此,我手动将可再发行组件包下载到Windows XP计算机上并检查其签名.签名在那里,但时间戳报告"不可用".点击详细信息还告诉我签名时间是"不可用".文件本身由过期的证书签名,因此如果没有此时间戳,自然验证将失败.

但是,如果我将同一文件下载到Windows 7计算机,则会显示时间戳.点击详细信息显示正确的签名,验证工作和安装.

我试过的

我安装了许多不同版本的"根证书更新"无济于事,包括最新版本.如果这确实是解决方案,请告诉我我需要哪一个.

我已经跟踪了签名上的证书链,并以"Microsoft Root Certificate Authority 2010"结束.此根证书似乎安装在XP计算机中.我唯一能看到的是这个证书的"2011"版本也在 "第三方根证书颁发机构"商店,而2010年则没有.我不知道这是问题的原因还是正常的.

我最终可能会使用禁用签名验证并使用基于散列的有效负载验证.但在此之前,我想知道我是否遗漏了一些明显的东西.

我的问题

是否有"正常"用户可以下载的更新或步骤,这将允许在XP/Vista中识别时间戳/会签?这里的"普通"用户意味着不具备计算机知识的人; 我不是指管理员权限.

timestamp windows-xp certificate digital-signature burn

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

使用BouncyCastle签名消息摘要

目前在C#中,我正在签署这样的挑战:

RSACryptoServiceProvider rsa;
RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(rsa);
RSAFormatter.SetHashAlgorithm("SHA1");
byte[] SignedHash = RSAFormatter.CreateSignature(paramDataToSign);
Run Code Online (Sandbox Code Playgroud)

然后我将其SignedHash交给Windows,它接受它,一切都OK。但是我需要将这部分移到Android上,这是一个问题,就是我无法获得相同的带符号哈希值。

在Android中,我尝试制作带符号的哈希,但它们不同于C#中生成的哈希。

Signature signer = Signature.getInstance("SHA1withRSA", "BC");
signer.initSign(privateKey);
signer.update(paramDataToSign);
signer.sign();
Run Code Online (Sandbox Code Playgroud)

在C#中-使用以下代码-我得到的结果与Android中的结果相同,但这不是可选项,因为Windows不接受签名的哈希。

ISigner signer = SignerUtilities.GetSigner("SHA1withRSA");
signer.Init(true, privateKey);
signer.BlockUpdate(paramDataToSign, 0, paramDataToSign.Length);
signer.GenerateSignature();
Run Code Online (Sandbox Code Playgroud)

此处写道,C#PKCS1SignatureFormatter和Java Signature应该给出相同的结果,但事实却并非如此。http://www.jensign.com/JavaScience/dotnet/VerifySig/

可能是什么问题呢?


这是我得到的基本64(WebSafe)值:

Challenge = zHyz12Tk4m151nssYIBWqBCAxhQ

RSAPKCS1SignatureFormatter SignedHash = kmu39keplCAV4Qnu22wdprLz4nGSsrVtHbxQ5YMUG7p-0YwReCG4ROIlFvYs4CGfjCiAGFPw4PLrLx7mrlAA6iuhJMkgm_PMTW9alQYTH612hLEUP4EmK0M2kw8CveLcjI3HA08z8bByllIzRyAlM8bcR438vw2uhx_CbgvOOHn8vwBPnvWbFqpi2doYoq2xEuFBRe7eBPrxbMRqEd3ExdQ9c9rYT4ivOJ4pbioyi6D5i5_1crvGwM6nQanMZCmooRYJO65NP3B4wWnvQZpJLRD0U08wWcvyGBFWp188ZovDjnkTQZku6lzmwGXfqQwtBz9uNvLcTbp7cVyt5EyQxw

Signature and ISigner SignedHash = Vt-b5QfGPnSPpZuIB8-H4N1K5hQXpImS4e8k56_HruDSqy3DLsz96QKUrccshjr1z9nTK3Mwvd5yPdyTJOqSUcDQqxV46LPhWQNsubqKxAz97ePpeslIH1gHdnzkh46ixsWqgDrhR7egQtDkU8PPsph1qahCxaVkRYspQBV0jPZ-LK4EjoGGnuWTCihVKjruXJZ2VY8yZ9QRAsHVptr0Nv-mldO2MFK-oEVbtVbHqUPf5So8im3oRSm68OqY4g56bCdFNSbhcFBjrZ1QPjnxiIk43-_5tevafqoOB2D_E_mQHCJwmRg3MrNij6IdAdloCejnhCWzgMHdcG1Ug_Qmig
Run Code Online (Sandbox Code Playgroud)

编辑:

因此,最简单的解决方案是使用Bouncy Castle API:

AsymmetricBlockCipher rsaEngine = new PKCS1Encoding(new RSABlindedEngine());
rsaEngine.init(true, privateKey);

DigestInfo dInfo = new DigestInfo(new AlgorithmIdentifier(X509ObjectIdentifiers.id_SHA1, DERNull.INSTANCE), paramDataToSign);
byte[] digestInfo = dInfo.getEncoded(ASN1Encoding.DER);

rsaEngine.processBlock(digestInfo, 0, …
Run Code Online (Sandbox Code Playgroud)

c# java cryptography bouncycastle digital-signature

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