标签: digital-signature

维护消息完整性

我有一条消息说我要传递给自己,这将受到中间人攻击.因此,我担心在发送消息之前保持消息的完整性以及我收到消息的时间.

应该假设,一旦我将消息发送给自己,将来我将无法获得有关所发送消息的信息.该消息完全是自包含的.

为此,我知道应该在发送消息之前对消息内容进行散列并比较散列,并且在发送消息之后,如果它们不同,则消息已被篡改.

当然,如果中间人知道散列实际上只是消息内容的散列,那么因为消息是自包含的,他只能创建新内容并应用相同的散列算法的内容.

问题是,在生成哈希时,我应该在多大程度上随机化消息内容?什么时候到达收益递减点?

在这种情况下,我有一组键/值对.为此,我知道我必须采取的步骤是:

  1. 在邮件中添加salt.盐是世界其他地方的秘密.它在散列之前附加到消息的内容.
  2. 在生成哈希之前以一致的方式对键/值对进行排序.
  3. 虽然不直接相关,但是在散列之前会将时间戳添加到每条消息的内容中,以防止重放攻击.

这些是我正在考虑的可选步骤:

  1. 在我订购之前转换密钥.我考虑过逆转它们,然后按计数/键排序.
  2. 使用分隔键/值对的分隔符(包括键/值的分隔符和对的分隔符).

注意

此处不需要邮件隐私,因此我不寻求加密.值必须以纯文本形式传输.

最后,我应该避免哪些哈希算法?


细节

我有一个ASP.NET MVC站点,我有一个处理输入验证和持久性的控制器.

如果(基于启发式,并不重要)输入被确定为自动垃圾邮件尝试,IDictionary<string, string>则使用输入值创建模型,并将ViewResult发送到通用CAPTCHA页面.

在该视图中,在包含CAPTCHA控件的表单中,IDictionary<string, string>将在隐藏的输入字段中写出内容,并且表单的操作将与内容最初发布到的操作相同.这样,MVC可以在重新提交表单时获取值.

这是因为我无法加密键/值对(或者我可以而且应该,告诉我为什么以及如何!).

当然,我需要再添加一个值,其中包含散列消息内容.如果该值存在,则控制器将检查是否保持了消息完整性,并允许输入持久存储.

我选择使用System.Security.Cyrptography.Pkcs命名空间中的SignedCms类,该命名空间表示CMS/PKCS#7消息的链接和验证.

为了详细说明,我已经使用MAKECERT.EXE创建了一个自行颁发的证书,然后在我的代码中,我使用此处的示例对数据进行数字签名:

http://blogs.msdn.com/shawnfa/archive/2006/02/27/539990.aspx

现在,应该保持导出的私钥上的密码安全,以及服务器上的安全性,这使得它更少编程.

我将不得不为重放攻击的时间戳添加额外的密钥,但这不会太难.

答案取决于Kalium,不是因为他的初始帖子,而是他的后续评论指出了数字签名的方式,并最终发现了如何在.NET中使用它们.

感谢所有贡献的人.

language-agnostic asp.net-mvc hash digital-signature

6
推荐指数
1
解决办法
894
查看次数

验证C#中使用BER/DER编码的ASN.1格式的DSA签名

如何在C#中验证DSA签名?

鉴于:

  • 消息文本,
  • 签名摘要(通常为ASN.1 DER格式),
  • 公钥(以签名的X.509证书,PEM或DER格式)

我尝试了很多方法,但没有取得任何成功:

  • OpenSSL.NET:库中的各种奇怪错误; 我在SourceForge上有一个与作者一起运行开放线程,但还没能解决这个问题.

  • Microsoft .NET API:无法解压缩DER签名以进行比较.DSA签名是40个字节(两个20字节整数),但是表示为两个整数的DER编码序列,因此总长度可以在46到48个字节之间(有关快速概述,请参阅此文章). NET包含解析ASN.1/DER的代码(因为它可以读取DER格式的证书),它深埋,并且无法访问它,因此您可以从ASN.1/DER编码的sig中正确检索40个字节.这个问题让我想到了下一个选择......

  • BouncyCastle:通过使用这些Org.BouncyCastle.Asn1函数,我可以解析ASN.1签名并将其拉入其组件R和S整数值.但是当我将这些传递给签名验证例程时,它没有给出任何解释.我不确定我做错了什么,因为C#API 完全没有文档记录,Java版本几乎没有记录(但是我找不到示例或HOWTO信息.)

我已经在这个问题上投入了大约一个星期了.我知道之前有人必须这样做,但我没有找到任何完整/有效的例子.

我有三个C#项目坐在这里,每个95%完成但有一个严重的缺陷导致它失败.任何工作示例代码都将非常受欢迎.

编辑:这是我正在尝试验证的签名示例,转换为Base64和ASCII十六进制以使其可用.这个特殊的一个是47字节,但是一个合适的解析器仍然必须接受它,在DER规范上读取更多信息(如果MSB为1,BER/DER添加前导00以确认符号)

Base64: MC0CFQCUgq2DEHWzp3O4nOdo38mDu8mStwIUadZmbin7BvXxpeoJh7dhquD2CTM=

ASCII Hex: 302d0215009482ad831075b3a773b89ce768dfc983bbc992b7021469d6666e29fb06f5f1a5ea0987b761aae0f60933
Run Code Online (Sandbox Code Playgroud)

结构符合DER规范; 它解析如下:

30 2d: sequence, length 45 (may vary from 44 to 46)
 02 15: integer, length 21 (first byte is 00 to confirm sign)
  009482ad831075b3a773b89ce768dfc983bbc992b7
 02 14: integer, length 20 (leading 00 not necessary for this one)
  69d6666e29fb06f5f1a5ea0987b761aae0f60933
Run Code Online (Sandbox Code Playgroud)

编写我自己的DER解析器实际上不是一个选项,错误的空间太大,必须有一种方法来正确地执行此操作.

.net c# asn.1 digital-signature

6
推荐指数
1
解决办法
6685
查看次数

如何使用.NET中的智能卡对PDF文件进行数字签名?

我有一张存储我的数字证书的智能卡.当我将其插入我的PC时,证书将显示在Windows证书存储区的IE>工具> Internet选项>内容>证书下.

那么......我如何使用这种证书在.NET中签署PDF文件?

.net pdf security digital-signature

6
推荐指数
1
解决办法
1594
查看次数

使用S/MIME在Ruby中对电子邮件进行数字签名

Ruby中有没有办法用S/MIME对电子邮件进行数字签名?我们的小组使用PKI,我们的用户可以期待重要消息的数字签名.

我知道我可以调用openssl命令行工具:

openssl smime -sign -signer $CERT_FILE -passin pass:$CERT_PASS
  -in $UNSIGNED_MAIL -out $SIGNED_MAIL -certfile $CERT_CA_FILE
  -from 'your ' -to 'recipients <email@address>'
  -subject 'The Subject'
Run Code Online (Sandbox Code Playgroud)

但我希望利用Ruby解决方案.

ruby email openssl smime digital-signature

6
推荐指数
1
解决办法
1530
查看次数

如何使用PHP检查来自broswer的数字签名

我有一个在浏览器中签署文本字符串的Javascript.它在Internet Explorer下使用CAPICOM,在Mozilla浏览器下使用window.crypto.签名过程后,我收到一个BASE64编码签名.

使用HTTPS我将签名和文本字符串上传到带有PHP应用程序的Web服务器.从SSL(HTTPS)我收到用户的证书.从这个证书我可以提取用户的公钥.

现在我想验证签名文本字符串的签名以及用户的证书和公钥.我试过openssl_verify PHP函数没有成功.

我总是收到一个错误:

错误:0408D077:rsa例程:FIPS_RSA_VERIFY:签名长度错误

  • 我有证书,没关系;
  • 我有从证书中提取的公钥,它也经过验证和确定;
  • 我有签名(BASE64解码);

不幸的是我无法验证签名?我无法提供演示或示例,因为它目前仅在本地网络中.

javascript php digital-certificate capicom digital-signature

6
推荐指数
1
解决办法
4353
查看次数

如何使用java在数字签名的pdf中添加空白页?

我想使用.在数字PDF的末尾插入空白页面.itext library我的困惑是添加页面将使现有签名无效?谢谢.

java pdf itext digital-signature

6
推荐指数
1
解决办法
4220
查看次数

使用AngularJS进行数字签名

我正在使用MEAN堆栈,我想为具有表单的员工实现数字签名,但我找不到关于此主题的任何库或教程.

有没有人这样做过?这样做的正确方法是什么?

digital-signature angularjs

6
推荐指数
2
解决办法
8425
查看次数

什么放入〜/ .gitconfig来暗示支持它的每个git子命令的--show-signature?

我只是通过搜索git-config(1),git-log(1)git-show(1)git的2.6.2的手册页,但没有发现任何提示的--show-signature选项(如到git showgit log)可以在我的全局配置~/.gitconfig对所有git支持它的子命令.

一个选项是别名,但由于我不知道哪些子命令都支持它,这只是一种解决方法,而不是解决方案.

我猜它可能是core.show-signature = yes或者core.showSignature = yes但并没有改变任何东西.

git logging gnupg digital-signature

6
推荐指数
1
解决办法
481
查看次数

RSA签名具有公共密钥作为文本未在java中验证

此问题是在继续过去的问题中生成的.如何RSA验证在php中生成的java中的签名.该代码适用于简单文本.但是现在我要求签署和验证格式中还有公钥(除验证密钥之外)的文本.

text1:text2:exported-public-key
Run Code Online (Sandbox Code Playgroud)

示例:

53965C38-E950-231A-8417-074BD95744A4:22-434-565-54544:MIIBCgKCAQEAxWg6ErfkN3xu8rk9WsdzjL5GpjAucMmOAQNeZcgMBxN+VmU43EnvsDLSxUZD1e/cvfP2t2/dzhtV6N2IvT7hveuo/zm3+bUK6AnAfo6pM1Ho0z4WetoYOrHdOVNMMPaytXiVkNlXyeWRF6rl9JOe94mMYWRJzygntiD44+MXsB6agsvQmB1l8thg/8+QHNOBBU1yC4pLQwwO2cb1+oIl0svESkGpzHk8xJUl5jL6dDnhqp8+01KE7AGHwvufrsw9TfVSAPH73lwo3mBMVXE4sfXBzC0/YwZ/8pz13ToYiN88DoqzcfD3+dtrjmpoMpymAA5FBc5c6xhPRcrn24KaiwIDAQAB 
Run Code Online (Sandbox Code Playgroud)

PHP代码:

$rsa = new Crypt_RSA();
$keysize=2048;
 $pubformat = "CRYPT_RSA_PUBLIC_FORMAT_PKCS1";
 $privformat = "CRYPT_RSA_PRIVATE_FORMAT_PKCS8";
$rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS8);
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);
$d = $rsa->createKey($keysize);
 $Kp = $d['publickey'];
 $Ks = $d['privatekey'];

$rsa = new Crypt_RSA();
$rsa->setPrivateKeyFormat(CRYPT_RSA_PRIVATE_FORMAT_PKCS8);
$rsa->setPublicKeyFormat(CRYPT_RSA_PUBLIC_FORMAT_PKCS1);
$d = $rsa->createKey($keysize);
$Kver = $d['publickey'];
$KSign = $d['privatekey'];

$plainText = "53965C38-E950-231A-8417-074BD95744A4:22-434-565-54544:".$Kp;

// Signing
$hash = new Crypt_Hash('sha256');
$rsa = new Crypt_RSA();    
$rsa->loadKey($KSign);
$rsa->setSignatureMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$rsa->setHash('sha256');

$signature = $rsa->sign($plainText);
$signedHS = base64_encode($signature);

// Verification

$signature = base64_decode($signedHS);
$rsa->loadKey($Kver);
$status = $rsa->verify($plainText, $signature);

var_dump($status);        
Run Code Online (Sandbox Code Playgroud)

JAVA代码

import static …
Run Code Online (Sandbox Code Playgroud)

php java cryptography bouncycastle digital-signature

6
推荐指数
1
解决办法
1301
查看次数

HMAC 256与HMAC 512 JWT签名加密

HS256和HS512加密算法之间是否存在实际差异,或者与已经牢不可破的密钥相比,是否存在更长的密钥冗余的附加安全性?我应该使用哪一个来加密JWT令牌?

甚至可以在auth0的java JWT中使用HS512加密吗?

authentication encryption http digital-signature jwt

6
推荐指数
1
解决办法
5545
查看次数