我有一条消息说我要传递给自己,这将受到中间人攻击.因此,我担心在发送消息之前保持消息的完整性以及我收到消息的时间.
应该假设,一旦我将消息发送给自己,将来我将无法获得有关所发送消息的信息.该消息完全是自包含的.
为此,我知道应该在发送消息之前对消息内容进行散列并比较散列,并且在发送消息之后,如果它们不同,则消息已被篡改.
当然,如果中间人知道散列实际上只是消息内容的散列,那么因为消息是自包含的,他只能创建新内容并应用相同的散列算法的内容.
问题是,在生成哈希时,我应该在多大程度上随机化消息内容?什么时候到达收益递减点?
在这种情况下,我有一组键/值对.为此,我知道我必须采取的步骤是:
这些是我正在考虑的可选步骤:
注意
此处不需要邮件隐私,因此我不寻求加密.值必须以纯文本形式传输.
最后,我应该避免哪些哈希算法?
细节
我有一个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中使用它们.
感谢所有贡献的人.
我有一个项目的exe,我正在使用数字签名签名,这意味着当它要求管理员权限时,它会显示公司名称.这非常有效但是如果你修改exe它仍然可以工作并在那里显示未知.
有没有办法在运行exe时检查数字签名是否有效,以避免修改版本运行?
Visual Studio 2008 windows 7
我在PHP中创建了一个简单的文件浏览器,通过生成过期的查询URL链接到文件.因此,对于对目录的每次访问,生成到每个文件的链接,该文件有效期为900秒.
我现在遇到的问题是生成的签名有时似乎失败了.这很奇怪,因为我故意使用外部S3库来生成URL和签名.
实际上,我尝试了以下库来生成签名:
库内部使用hash_hmac('sha256',...或hash_hmac('sha1',...) - 我也不明白为什么使用不同的哈希算法.
由于所有库的问题都是一样的,所以它也可以在我的URL生成代码中,但这很简单:
$bucket = "myBucket";
$filename = $object->Key;
$linksValidForSeconds = 900;
$url = $s3->get_object_url($bucket, $filename, $linksValidForSeconds);
Run Code Online (Sandbox Code Playgroud)
Sp $ bucket和$ linksValidForSeconds是常量,$ filename是例如"Media/Pictures/My Picture.png".但是对于相同变量的事件,它有时是有效的,因此不能.
有任何想法吗?
编辑:Typo /错误的常量变量名称已修复(谢谢)
我在4.0中有一个WCF服务.
我需要在SOAP响应中添加数字签名.我不太确定它应该如何实现.我相信响应应该看起来像下面链接中显示的内容.
https://spaces.internet2.edu/display/ISWG/Signed+SOAP+Messages
有什么地方可以获得有关此的详细信息吗?请指教.
我想以编程方式在运行时检查APK的签名.我在我的开发工作站上拥有一个密钥库,所以我可以知道(不知道如何)我正在用APK签名的公钥.
一旦我知道标牌后公钥是什么,我想输入源代码并检查当前运行的应用程序是否与密钥匹配.
可能吗?如果是这样,我如何从Eclipse生成的密钥库中获取公钥?
谢谢.
我想使用.在数字PDF的末尾插入空白页面.itext library我的困惑是添加页面将使现有签名无效?谢谢.
我们希望我们的用户下载适用于Windows的软件的预配置安装程序.预配置数据包含基于用户帐户数据的设置.自定义将在Linux上运行的Java服务器中完成.我们需要对这些安装程序进行数字签名.遗憾的是,由于安全策略,我们无法在这些服务器上拥有私人签名密钥.
你能想到在保留数字签名或其他方法来实现用例的同时将一些元数据放入MSI或EXE的方法吗?
编辑:要求是单个文件下载,所以不幸的是并行的ini文件不能满足它.它主要是提供一组连接点(特定于用户) - 我们不会打扰用户,因为我们已经知道它们.
我正在尝试使用视觉签名和pdfbox制作PDF.我有两个流,似乎pdfbox只能处理文件.没有三个临时文件,我没有设法让它工作.我可以从这里看到API已经改变,但它仍处理文件.
public void signPdf(InputStream originalPdf, OutputStream signedPdf,
InputStream image, float x, float y,
String name, String location, String reason) {
File temp = null;
File temp2 = null;
File scratchFile = null;
RandomAccessFile randomAccessFile = null;
OutputStream tempOut = null;
InputStream tempIn = null;
try {
/* Copy original to temporary file */
temp = File.createTempFile("signed1", ".tmp");
tempOut = new FileOutputStream(temp);
copyStream(originalPdf, tempOut);
tempOut.close();
/* Read temporary file to second temporary file and stream */
tempIn = new …Run Code Online (Sandbox Code Playgroud) 此问题是在继续过去的问题中生成的.如何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加密吗?
java ×3
php ×2
.net ×1
amazon-s3 ×1
android ×1
apk ×1
asp.net-mvc ×1
bouncycastle ×1
c# ×1
c++ ×1
cryptography ×1
encryption ×1
hash ×1
http ×1
installation ×1
installer ×1
itext ×1
jwt ×1
pdf ×1
pdfbox ×1
wcf ×1
winapi ×1
windows-7 ×1