问题标签 [digital-signature]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
7 回答
107723 浏览

java - SHA1 和 RSA 与 java.security.Signature 对比 MessageDigest 和 Cipher

我试图了解 Java java.security.Signature类的作用。如果我计算一个 SHA1 消息摘要,然后使用 RSA 对该摘要进行加密,我会得到与要求Signature类签署相同内容不同的结果:

结果(例如):

输入数据:这是正在签名的消息
摘要:62b0a9ef15461c82766fb5bdaae9edbe4ac2e067
密文:057dc0d2f7f54acc95d3cf5cba9f944619394711003bdd12...
签名:7177c74bbbb871cc0af922e30d2808ebae1...25

我必须对Signature正在做什么有一个根本的误解——我已经通过它进行了跟踪,它似乎正在调用MessageDigest对象的更新,算法设置为 SHA1,正如我所期望的那样,然后获取摘要,然后执行加密。是什么导致结果不同?

编辑:

Leonidas 让我检查签名方案是否应该按照我的想法去做。RFC中定义了两种类型的签名:

其中第一个(PKCS1)是我上面描述的那个。它使用散列函数创建摘要,然后使用私钥对结果进行加密。

第二种算法使用随机盐值,更安全但不确定。如果重复使用相同的密钥,上面代码产生的签名不会改变,所以我认为它不可能是 PSS。

编辑:

这是bytes2string我使用的方法:

0 投票
2 回答
623 浏览

html - 是否可以对 Adob​​e LiveCycle HTML 表单进行数字签名?

是否可以对 Adob​​e LiveCycle HTML 表单进行数字签名?

我知道使用 IBM Lotus Forms,您可以签署表单,并使用 ActiveX 控件呈现为 HTML。

0 投票
3 回答
1957 浏览

c# - CAPICOM - 验证 SignedCode 来自没有 UI 的受信任的发布者

我在 .NET 3.0 C# 应用程序中使用 CAPICOM 来检查 exe 文件上的 Authenticode 签名。我需要确保证书被列为受信任的发布者。如果证书尚未受信任,使用signedCode.Verify(true)将显示一个对话框,因此用户可以选择是否这样做。但是,signedCode.Verify(false)即使签名不是来自受信任的发布者,也会验证签名 - 大概这只是检查证书是否有效。

如何在没有 UI 的情况下检查文件上的签名是否来自有效且受信任的证书?

0 投票
5 回答
1023 浏览

asp.net-mvc - 维护消息完整性

我有一条消息要传递给自己,该消息将受到中间人攻击。正因为如此,我担心在我发送消息和接收回消息之间保持消息的完整性。

应该假设,一旦我将消息发送给自己,将来我将无法获得有关所发送消息的任何信息。该消息是完全独立的。

为此,我知道应该在发送消息之前对消息内容进行哈希处理并比较哈希值,在我发送消息之后,如果它们不同,则表明消息已被篡改。

当然,如果中间人知道哈希实际上只是消息内容的哈希,那么由于消息是自包含的,他可以创建新内容并应用相同的哈希算法的内容。

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

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

  1. 在消息中添加盐。盐是世界其他地方的秘密。它在散列之前附加到消息的内容。
  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 中使用它们。

感谢所有做出贡献的人。

0 投票
2 回答
592 浏览

java - 用于签署和加密文件的客户端-服务器解决方案

我正在寻找一种解决方案来执行文件加密和签名。这将在客户端完成,在服务器端进行签名检查和解密。

一些细节:

  • 这应该适用于任何类型的文件(签名应该“附加”到文件中,而不是像 PDF 那样在文件中)
  • 至少服务器端应该是基于 Java 的(客户端可以是 Java 小程序)

编辑:客户部分确实是这里更大的问题。虽然服务器端可以使用现有的库来实现,但客户端应该是现有的应用程序(即使是商业应用程序)。

0 投票
3 回答
25848 浏览

php - 生成带有数字签名的 PDF

是否可以在 PHP 中生成带有数字签名的 PDF 文件?首选开源解决方案。

0 投票
1 回答
1132 浏览

printing - 打印 X.509 数字签名

我正在使用数字证书签署交易结果,另外,我需要打印一张带有信息和数字签名的单据。

我想知道是否有专门为印刷媒体设计的 X.509 数字签名的更短表示?也许某种哈希或类似的东西......

非常感谢!

0 投票
3 回答
3978 浏览

.net - 应该签署互操作程序集吗?

我们有一组用 VC++ 开发的 COM 组件。当对此类组件的引用添加到 .NET 项目时,Visual Studio 会生成一个互操作程序集。我们现在有一组这样的程序集。

在运行我们的日常构建时,我们使用数字签名对所有生成的二进制文件进行签名。互操作程序集没有签名,因为我们不认为我们是作者 - 任何人都可以使用 Visual Studio 并生成相同的程序集。

我们是否也应该签署互操作程序集?我们是否也应该使用强名称(sn.exe 实用程序)对它们进行签名?这样做的原因是什么?

0 投票
6 回答
211 浏览

authentication - 基于数字签名的登录系统是个好主意吗?

OpenID 的目标之一是抵御任何一家公司的失败。这听起来不错,但还有另一个问题:如果托管您的 ID 的站点出现故障,那么您的 ID 也会出现故障。我认为必须有一个完全抵抗失败的登录系统。

我的想法是这样的:我去一个网站,我必须登录。我给他们我的公钥。该网站向我发送了一些随机数据。我用我的私钥签署这些数据并将其发回给他们。如果签名有效,我就会登录。这样做的好处是我的 ID 只是我的公钥,所以我不依赖任何外部站点。

为了使用户不必记住那里的密钥,系统还可以选择允许类似 OpenID 的系统,其中我的密钥托管在某个服务器上,原始站点将我重定向到那里登录,并且该站点对数据进行签名并将其发送回原始站点,然后我已登录。此方法的工作方式类似于 OpenID,但允许我备份我的密钥,因此如果该站点出现故障,我可以使用另一个站点。

这是一个实用的系统吗?我只是在浪费时间吗?我不应该重新发明轮子而只使用 OpenID 吗?

0 投票
5 回答
4023 浏览

c# - 使用私钥数字登录 PHP,在 C# 中验证

我正在开发一项功能,需要我在 PHP 中对短字符串进行数字签名,并在 C# 中验证字符串的签名。

我真的很想在 PHP 中使用openssl_sign,因为它很简单,但我在 Google 上找到的所有信息都表明这不起作用。

一些外部库声称做得很好,但是由于这是一个爱好项目,我宁愿不购买这样的库。

那么这里有什么替代方案呢?需要 C# 和 PHP 之间的完全互操作性。可以使用 OpenSSL 以外的库。