Java IAIK Pkcs11 包装器生成的 key 未保留

标签 java pkcs#11

有人可以帮忙解决以下问题吗?

我正在使用:

  • 适用于 Windows 的 SoftHSM
  • 用于连接到 SoftHSM 的 IAIK Pkcs11 Java Wrapper (v.1.4)

我的 Java 应用程序通过以下步骤生成 AES key :

  1. PKCS11 session 已打开,已执行登录。
  2. AES key 已成功生成。
  3. 正在搜索此 key - 已找到。
  4. 闭幕式。

但是如果我打开新 session ,我就再也找不到 key 了——当我关闭 session 时它会消失,并且不会持久保存到 HSM。

我做错了什么吗?

申请代码是:

import java.io.IOException;

import iaik.pkcs.pkcs11.Mechanism;
import iaik.pkcs.pkcs11.Module;
import iaik.pkcs.pkcs11.Session;
import iaik.pkcs.pkcs11.Slot;
import iaik.pkcs.pkcs11.Token;
import iaik.pkcs.pkcs11.TokenException;
import iaik.pkcs.pkcs11.objects.AESSecretKey;
import iaik.pkcs.pkcs11.objects.Object;
import iaik.pkcs.pkcs11.wrapper.PKCS11Constants;

public class GenerateKeyAes {

    public static void main(String[] args) throws IOException, TokenException {

        // Init module and select slot and token
        Module module = Module.getInstance("C:\\prog\\SoftHSM2\\lib\\softhsm2.dll");
        module.initialize(null);
        Slot slot = module.getSlotList(Module.SlotRequirement.TOKEN_PRESENT)[0];
        Token token = slot.getToken();

        // Create session and login
        Session session = token.openSession(Token.SessionType.SERIAL_SESSION, Token.SessionReadWriteBehavior.RW_SESSION,
                null, null);
        session.login(Session.UserType.USER, "1111".toCharArray());

        // Prepare key template
        Mechanism keyGenerationMechanism = Mechanism.get(PKCS11Constants.CKM_AES_KEY_GEN);

        AESSecretKey secretKeyTemplate = new AESSecretKey();
        secretKeyTemplate.getValueLen().setLongValue(new Long(32));
        secretKeyTemplate.getLabel().setCharArrayValue("AES secret 1".toCharArray());
        secretKeyTemplate.getId().setByteArrayValue(new byte[] { 105 });
        secretKeyTemplate.getSign().setBooleanValue(Boolean.TRUE);
        secretKeyTemplate.getVerify().setBooleanValue(Boolean.TRUE);
        secretKeyTemplate.getToken().setBooleanValue(Boolean.FALSE);

        // Create key
        AESSecretKey secretKey = (AESSecretKey) session.generateKey(keyGenerationMechanism, secretKeyTemplate);

        System.out.println("Key generated:");
        System.out.println(secretKey.toString());
        System.out.println();

        // Find all objects to ensure that generated key was really created
        AESSecretKey template = new AESSecretKey();
        session.findObjectsInit(template);
        Object[] obs = session.findObjects(10);
        System.out.println("Found objects: " + obs.length);
        System.out.println();

        // Key is found and displayed here!!!
        for (Object ob : obs) {
            System.out.println("Found object:");
            System.out.println(ob);
            System.out.println();
        }

        // Close session
        session.findObjectsFinal();
        session.closeSession();

        // If I open new session here and perform same search - no key is found!

        module.finalize(null);
    }
}

最佳答案

PKCS#11 对象可以按其生命周期和可见性分类为:

  1. token 对象(CKA_TOKEN 属性设置为 true 的对象)。
    它们对所有连接到具有足够权限的 token 的应用程序可见,并且即使在 session (应用程序和 token 之间的连接)关闭并且 token 从其插槽中移除后,它们仍保留在 token 上。

    <
  2. session 对象(CKA_TOKEN 属性设置为 false 的对象)
    它们更临时——无论何时以任何方式关闭 session ,该 session 创建的所有 session 对象都会自动销毁。此外, session 对象仅对创建它们的应用程序可见。

我不熟悉 IAIK 包装器,但您似乎正在将 key 创建为 session 对象。

我会尝试改变:

secretKeyTemplate.getToken().setBooleanValue(Boolean.FALSE);

secretKeyTemplate.getToken().setBooleanValue(Boolean.TRUE);

参见 PKCS#11 v2.20 specification了解更多详情。

关于Java IAIK Pkcs11 包装器生成的 key 未保留,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47377824/

相关文章:

java - 升级Java后找不到Sun.security

digital-signature - 如何使用智能卡在 Web 应用程序 (JavaScript) 中制作数字签名?

java - Intellij 不会自动更新我的 Google App Engine 项目的资源

java - 使用 'NOT IN' 的备用逻辑的 Google App Engine JDO 查询

java - 使用actionlistener调用同一个类中的void函数

java - 从 Java 访问 Firefox 的证书信任库

java - 通过 Java 解锁智能卡的 PIN (SunPKCS11)

smartcard - 虚拟智能卡的实现

java - 使用 java 对 WebService 的 SOAP 请求

java - 迭代一个集合并创建一个包含 HTML 的字符串