我有一条消息说我要传递给自己,这将受到中间人攻击.因此,我担心在发送消息之前保持消息的完整性以及我收到消息的时间.
应该假设,一旦我将消息发送给自己,将来我将无法获得有关所发送消息的信息.该消息完全是自包含的.
为此,我知道应该在发送消息之前对消息内容进行散列并比较散列,并且在发送消息之后,如果它们不同,则消息已被篡改.
当然,如果中间人知道散列实际上只是消息内容的散列,那么因为消息是自包含的,他只能创建新内容并应用相同的散列算法的内容.
问题是,在生成哈希时,我应该在多大程度上随机化消息内容?什么时候到达收益递减点?
在这种情况下,我有一组键/值对.为此,我知道我必须采取的步骤是:
这些是我正在考虑的可选步骤:
注意
此处不需要邮件隐私,因此我不寻求加密.值必须以纯文本形式传输.
最后,我应该避免哪些哈希算法?
细节
我有一个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中使用它们.
感谢所有贡献的人.
如何在C#中验证DSA签名?
鉴于:
我尝试了很多方法,但没有取得任何成功:
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解析器实际上不是一个选项,错误的空间太大,必须有一种方法来正确地执行此操作.
我有一张存储我的数字证书的智能卡.当我将其插入我的PC时,证书将显示在Windows证书存储区的IE>工具> Internet选项>内容>证书下.
那么......我如何使用这种证书在.NET中签署PDF文件?
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解决方案.
我有一个在浏览器中签署文本字符串的Javascript.它在Internet Explorer下使用CAPICOM,在Mozilla浏览器下使用window.crypto.签名过程后,我收到一个BASE64编码签名.
使用HTTPS我将签名和文本字符串上传到带有PHP应用程序的Web服务器.从SSL(HTTPS)我收到用户的证书.从这个证书我可以提取用户的公钥.
现在我想验证签名文本字符串的签名以及用户的证书和公钥.我试过openssl_verify PHP函数没有成功.
我总是收到一个错误:
错误:0408D077:rsa例程:FIPS_RSA_VERIFY:签名长度错误
不幸的是我无法验证签名?我无法提供演示或示例,因为它目前仅在本地网络中.
javascript php digital-certificate capicom digital-signature
我想使用.在数字PDF的末尾插入空白页面.itext library我的困惑是添加页面将使现有签名无效?谢谢.
我正在使用MEAN堆栈,我想为具有表单的员工实现数字签名,但我找不到关于此主题的任何库或教程.
有没有人这样做过?这样做的正确方法是什么?
我只是通过搜索git-config(1),git-log(1)和git-show(1)git的2.6.2的手册页,但没有发现任何提示的--show-signature选项(如到git show或git log)可以在我的全局配置~/.gitconfig对所有git支持它的子命令.
一个选项是别名,但由于我不知道哪些子命令都支持它,这只是一种解决方法,而不是解决方案.
我猜它可能是core.show-signature = yes或者core.showSignature = yes但并没有改变任何东西.
此问题是在继续过去的问题中生成的.如何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) HS256和HS512加密算法之间是否存在实际差异,或者与已经牢不可破的密钥相比,是否存在更长的密钥冗余的附加安全性?我应该使用哪一个来加密JWT令牌?
甚至可以在auth0的java JWT中使用HS512加密吗?
.net ×2
java ×2
pdf ×2
php ×2
angularjs ×1
asn.1 ×1
asp.net-mvc ×1
bouncycastle ×1
c# ×1
capicom ×1
cryptography ×1
email ×1
encryption ×1
git ×1
gnupg ×1
hash ×1
http ×1
itext ×1
javascript ×1
jwt ×1
logging ×1
openssl ×1
ruby ×1
security ×1
smime ×1