问题标签 [hsm]

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 投票
1 回答
4066 浏览

java - PKCS11 derivedKey() 和 encrypt() 为 3DES 返回不同的结果

我正在使用 HSM 和 PKCS11 解决密钥派生问题,目前我不明白为什么我会看到完全不同的结果,具体取决于我使用的是 derivedKey() 方法而不是使用 encrypt() 方法。在这两种情况下,我都尝试对结果使用 DESede/ECB/NoPadding 算法,但根据我用来生成结果的方法(deriveKey 与加密),我会看到不同的结果。

稍等片刻,进行高级概述... 我正在使用 Global Platform 使用的特定密钥派生方法来多样化用于智能卡的主密钥。该方法以一个主密钥和用于派生新密钥的 8 字节数据(多样化数据)开始。div 数据字节实际上只是使用 DESede/ECB/NoPadding 使用主密钥加密,结果用作新派生的 3DES 密钥的一部分。(实际上,执行了多次加密,并将结果连接在一起形成新密钥,但这不是这里的问题。)

我已经验证了两种情况下的主密钥,验证了两种情况下的多样化数据是相同的,验证了我使用的是具有相同填充的相同算法。我还尝试将派生密钥模板更改为 DES、2DES、3DES。所有产生的结果相似,只是长度不同。

目前我已经使用 IAIK 包装器(用 Java 编写的 pkcs11 包装器)实现了我的测试用例,我将在此处发布。密钥只是一个测试密钥,div数据是样本div数据,所以这里没有敏感信息。我首先在 HSM 中创建一个基本密钥,然后尝试通过使用多样化数据调用 session.deriveKey() 来派生一个新密钥。派生的密钥字节以十六进制打印(密钥值不正确,基于我当前工作的实现,该实现在内存中而不是在 HSM 中派生密钥)。接下来,我简单地初始化会话以使用主密钥执行加密,然后加密多样化数据。这会产生预期值(再次检查工作实现)。

我正在寻找的是,当我使用相同的基本密钥、相同的 div 数据和相同的加密算法时,为什么这些操作会产生不同的结果。我不明白deriveKey() 在表面下做了什么,我找不到任何文档或源代码来阐明这一点。我必须能够使用派生密钥()方法,因为派生密钥在 HSM 之外不可用。

任何见解表示赞赏。

这是我运行上述代码时的相关输出:

0 投票
2 回答
2520 浏览

security - 应用于 HSM 交互安全

我觉得我错过了什么。我知道 HSM 可以为您的密钥、加密数据等提供 100% 的防弹保护。但是,在您访问 HSM 并将您的机密复制到用户内存后,如何防止攻击者窃取您的敏感数据?或者例如,只是使用相同的 API 来访问模块?应用程序身份验证如何工作?如果它基于简单的东西,比如密码,为什么攻击者不能从内存中窃取密码,登录到 HSM 并得到他想要的?另外,如果内核被入侵,我认为它可以监听或篡改进程和 HSM 之间的任何通信,对吗?

0 投票
3 回答
2018 浏览

rsa - 如何在 HSM 中包装 Microsoft RSA 密钥 blob

我需要将 RSAPrivateKey 包装在 HSM 中,以便可以将其发送到 Microsoft CA 进行密钥存档,但我不确定要采取什么方法。

问题是 Microsoft RSA 密钥格式是专有的,似乎不受 pkcs11 或我公司使用的 nCipher HSM 的支持。

http://msdn.microsoft.com/en-us/library/cc250013.aspx

如果这只是一个 RSAPrivateKey,则可以直接在 HSM 中生成密钥对,在 HSM 中加载包装密钥,包装 RSAPrivateKey 并提取包装的密钥字节。显然,由于不支持这种密钥 blob 格式,我需要采取不同的方法。

我的第一个想法是扩展 RSAPrivateKey 并覆盖 getEncoded() 方法以返回此专有密钥格式。我正在使用 IAIK pkcs11 包装器,它为 Java 中的 pkcs11 提供高级 API,并且支持创建供应商定义的密钥类型。但是,供应商定义的密钥接口似乎只是为了方便扩展客户端代码中的内置密钥类型而存在,实际上并不允许修改 HSM 中的密钥编码。

第二个想法是使用 pkcs11 数据对象并将其简单地视为密钥 blob,然后使用包装密钥对其进行加密。这里同样的问题是,为了将私钥字节复制到数据对象中,似乎我需要将私钥字节提取到应用程序代码中,然后从那里创建数据对象,这违背了拥有的全部意义HSM 中的密钥。

我正在寻找这些方法的替代品,或者我忽略了 pkcs11 中的某些功能可以让我这样做?任何见解将不胜感激。

0 投票
3 回答
17539 浏览

c++ - 使用来自 USB 令牌的证书和密钥进行数字签名

我想使用来自 USB 令牌(加密狗)的用户密钥和证书签署文件。

我已经在 stackoverflow 和其他网站上搜索了一段时间,但除了 .NET 框架中的一些好的功能(我没有使用)之外,没有得到任何有用的东西。

似乎由于密钥没有暴露,加密是由硬件本身完成的。这是否意味着每个硬件制造商都提供了自己的 API,并且没有通用的方法来解决这个问题?

另外,我读到,一旦将令牌插入计算机,其证书就会加载到系统存储中。是否可以使用商店的证书?如何在商店中识别和访问此类证书?那么私钥呢?

当可以从 .p12 或 .pfx 文件中提取证书时,我使用 OpenSSL 进行数字签名。

如果我在某个地方错了,请纠正我,我是这个话题的新手。

0 投票
1 回答
588 浏览

c++ - 在 CryptoAPI 中识别 CSP 提供者

我正在使用 MS CAPI API 来使用 USB 令牌进行数字签名。

使用 CryptAcquireContext,我可以打印出所有可用 CSP 的名称,但我如何知道哪个 CSP 与插入的 USB 令牌相关联?

此外,如果有多个令牌插入计算机怎么办?

应用程序应该如何选择 CSP?

0 投票
1 回答
1624 浏览

pdf - iText:人们使用什么类型的证书在 Linux 上自动进行 PDF 签名?

我有一个小批量(<500 个 PDF/年)应用程序,用于在 Linux 上使用 Java 中的 iText 对 PDF 文件进行自动数字签名。

我有 iText 使用我的 SSL 证书向 PDF 添加数字签名。这是证明 PDF 是由我的域(例如服务器)生成的有效方法吗?它可以以某种方式用于在 Adob​​e Reader 中获得显示“信任”的绿色复选标记吗?

如果不是,我应该使用用于 PDF 的证书(例如,不是我的 SSL 证书),以便在用户打开 PDF 文档时自然出现表示“信任”的绿色小复选标记。

http://itextpdf.com/book/digitalsignatures这本书很好地向我介绍了这个主题(我在这方面的经验很少)。

这本书谈到了 SafeNet Luna 设备(HSM),但它太贵了。我只需要一个最小的解决方案,而 Luna 有很多花里胡哨的东西。Luna PCIe设备较便宜,但除了提供可用于签名的证书外,我不需要任何功能。此外,基于 USB 的 SafeNet iKey设备似乎只面向 Windows 设备销售。有没有人让 iKey 在 Linux 上工作?甚至可能吗?其他公司是否提供在 Linux 上运行的基于 USB 的设备?

我正在寻找一种在 Linux 机器上提供自动数字签名 PDF 的最小解决方案。我相信很多小企业都有类似的需求。我只是想利用现有的知识。人们如何解决这个问题?

我看到的用于自动化此过程的解决方案假设大公司使用 Adob​​e Live Cycle,并相应地定价(参见例如:https ://www.globalsign.com/pdf-signing/compare-pdf-signing.html )。但小企业也需要自动化。

理想情况下,有人会出售类似于 SSL 证书的证书,但用于 PDF 文件。有这样的事吗?

硬件(某种)是必需的(似乎是这样)?如果需要硬件,是否有任何最小的解决方案(例如,除了启用数字签名之外,功能有限)?

希望有人能帮我从树上看森林。什么是传统智慧?

0 投票
1 回答
1149 浏览

linux - 如何从 linux / cygwin 控制台运行 Thales“NC”诊断主机命令

我想直接从 linux / cygwin 控制台运行 Thales NC(执行诊断)主机命令。

如何才能做到这一点?

0 投票
1 回答
1384 浏览

xml-signature - 在 JAVA 中使用 pkcs11 Wrappers 对 XML 进行签名

我编写了一个程序来使用 Java 提供的数字签名 API(即 javax.xml.crypto.dsig 包中的类)对 XMl 文件进行签名。但是要签署 xml 文档,必须提供私钥,以创建签名上下文,然后再指定如下语句中的摘要。

当我将私钥存储在 HSM 等安全存储中时,我想对 xml 进行签名。我有包装类来访问 JAVA 中的 HSM,所以我可以获得私钥的句柄,但不知道如何使用它进行签名。

谁能指导我如何以这种方式签署 XML...

0 投票
1 回答
5637 浏览

java - 让 java IAIK PKCS11 包装器为 nfast 工作

我正在尝试让 IAIK PKCS11 包装器与 nfast 一起使用。

它总是期待 pkcs11wrapper 库文件并引发错误 -

java.lang.UnsatisfiedLinkError: pkcs11wrapper(在 java.library.path 中找不到)

如何让它使用/opt/nfast/toolkits/pkcs11/libcknfast.soHSM 提供的库文件 ( )?

任何帮助都非常感谢和忘记!

0 投票
1 回答
2638 浏览

c - 在 PKCS#11 中使用 Key 对象句柄

我正在尝试使用供应商提供的 PKCS#11 函数与 HSM 交互。我使用以下一系列函数来生成密钥,加密和解密数据。下面的序列效果很好。

  1. C_Initialize
  2. C_OpenSession
  3. C_Login
  4. C_GenerateKey //3DES KEY
  5. C_EncryptInit
  6. C_Encrypt
  7. C_DecryptInit
  8. C_Decrypt
  9. C_Logout
  10. C_CloseSession

我的问题:

  1. 使用 C_Logout 和 C_CloseSession 后,有没有办法通过使用相同的登录凭据重新登录并再次打开会话来再次重用相同的 KEY(之前生成的)?

  2. 当我使用 C_CreateObject 时,它会创建会话对象并在使用 C_CloseSession 时将其销毁吗?