Pkcs11Interop 从 HSM 读取密钥值

2024-04-25

我正在尝试使用 Pkcs11Interop 从 HSM 中提取密钥的值。我知道,密钥必须留在 HSM 中,但我需要它,所以...

我已经用 NCryptoki 做到了,我也想用 Pkcs11Interop 做到这一点

我尝试了这段代码:

// Prepare attribute template that defines search criteria
List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>();
objectAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_SECRET_KEY));
objectAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_DES));
objectAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, "MY_KEY"));

// Find all objects that match provided attributes
List<ObjectHandle> foundObjects = session.FindAllObjects(objectAttributes);

var key = foundObjects[0];
 byte[] plainKeyValue = null;
 List<ObjectAttribute> readAttrs = session.GetAttributeValue(key, new List<CKA>() { CKA.CKA_VALUE });
 if (readAttrs[0].CannotBeRead)
     throw new Exception("Key cannot be exported");
 else
     plainKeyValue = readAttrs[0].GetValueAsByteArray();

但是 plainKeyValue 全部为零,但是,正如您可以想象的那样,这不是真的。

那么,我怎样才能实现我的目标呢?


我用这段代码解决了它

static public byte[] findTargetKeySValue(String label, String type, string command)
{
    try
    {
        string pkcs11LibraryPath = @"C:\Program Files\SafeNet\Protect Toolkit 5\Protect Toolkit C SDK\bin\hsm\cryptoki.dll";
        Utility.Logger("cryptoki dll path " + pkcs11LibraryPath, command);
        using (Pkcs11 pkcs11 = new Pkcs11(pkcs11LibraryPath, Inter_Settings.AppType))
        {
            // Find first slot with token present
            Slot slot = Inter_Helpers.GetUsableSlot(pkcs11);
            // Open RW session
            using (Session session = slot.OpenSession(SessionType.ReadOnly))
            {
                // Login as normal user
                session.Login(CKU.CKU_USER, Inter_Settings.NormalUserPin);
                // Prepare attribute template that defines search criteria
                List<ObjectAttribute> objectAttributes = new List<ObjectAttribute>();
                objectAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_SECRET_KEY));
                if (type == "DES")
                    objectAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_DES));
                else if (type == "DES2")
                    objectAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_DES2));
                else if (type == "DES3")
                    objectAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_DES3));
                objectAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, label));//PROVAK

                List<ObjectHandle> foundObjects = session.FindAllObjects(objectAttributes);
                var key = foundObjects[0];
                byte[] plainKeyValue = null;
                List<ObjectAttribute> readAttrsSensitive = session.GetAttributeValue(key, new List<CKA>() { CKA.CKA_SENSITIVE });
                if (!readAttrsSensitive[0].GetValueAsBool())
                {
                    Utility.Logger("findTargetKeySValue chiave " + label + " non senstive", command);
                    List<ObjectAttribute> readAttrs = session.GetAttributeValue(key, new List<CKA>() { CKA.CKA_VALUE });
                    if (readAttrs[0].CannotBeRead)
                        throw new Exception("Key cannot be exported");
                    else
                        plainKeyValue = readAttrs[0].GetValueAsByteArray();
                    //Console.WriteLine(ByteArrayToAsciiHEX(plainKeyValue));
                    session.Logout();
                    return plainKeyValue;
                }
                else
                {
                    Utility.Logger("findTargetKeySValue chiave " + label + " senstive", command);
                    Console.WriteLine("wrap/unwrap");
                    objectAttributes = new List<ObjectAttribute>();
                    objectAttributes.Add(new ObjectAttribute(CKA.CKA_CLASS, CKO.CKO_SECRET_KEY));
                    objectAttributes.Add(new ObjectAttribute(CKA.CKA_KEY_TYPE, CKK.CKK_DES3));
                    objectAttributes.Add(new ObjectAttribute(CKA.CKA_LABEL, "WRAPPING_KEY")); //WRAPPING_KEY WRK
                    foundObjects = session.FindAllObjects(objectAttributes);

                    var wrappingKey = foundObjects[0];
                    Mechanism m = new Mechanism(CKM.CKM_DES3_ECB);

                    var wrapped = session.WrapKey(m, wrappingKey, key);
                    //Console.WriteLine("wrapped " + ByteArrayToAsciiHEX(wrapped));

                    //Console.WriteLine(ByteArrayToAsciiHEX(session.Decrypt(m, wrappingKey, wrapped)));
                    var k = session.Decrypt(m, wrappingKey, wrapped); 
                    session.Logout();
                    return k;

                }
            }
        }
    }
    catch (Exception e)
    {
        //Console.WriteLine(e.ToSafeString());
        Utility.Logger("findTargetKeySValue " + e.ToSafeString(), command);
        return null;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Pkcs11Interop 从 HSM 读取密钥值 的相关文章

  • Android:Google 地图 Android API:授权失败

    当我的应用程序尝试使用 Google Maps API 时 当我尝试访问 Google Map API 数据时 我会立即收到以下 logcat 错误 向右滚动以查看好东西 02 02 15 39 35 329 23868 24511 com
  • 如何根据defaultdict中的key累加值

    如果我有一个 defaultdict list from collections import defaultdict d defaultdict list such as 1 0 1 0 2 1 0 3 2 0 2 2 0 4 2 0 1
  • SSH“无法将主机添加到已知主机列表”Openshift

    我尝试使用ssh命令连接到另一个远程主机 ssh p 21098 i OPENSHIFT DATA DIR ssh host key email protected cdn cgi l email protection The authen
  • 获取与 python dict 中的 max(value) 对应的键[重复]

    这个问题在这里已经有答案了 让我们考虑一下 键 值 对的示例字典 如下所示 dict1 a 10 x 44 f 34 h 89 j 90 d 28 g 90 dict2 a 10 x 44 f 34 h 89 j 90 d 28 在字典中的
  • 在 TreeMap、HashMap 或 LinkedHashMap 中存储具有重复键的值

    我目前正在开展一个项目 在该项目中我从社会保障网站检索有关姓名的数据 基本上我得到了一个数字x 以及年份y和z 我必须返回 y 到 z 每年的前 x 个名字 所以从网站返回的数据是姓名 排名和年份 我必须将返回的每个名称输入到 TreeMa
  • 我不小心删除了 Android 密钥库,如何恢复?

    好吧 我的动作很顺利 我现在无法更新市场中的任何应用程序 因为我不小心删除了我的 Android 密钥库 有谁知道我怎样才能把它拿回来 我尝试过运行恢复程序 但由于某种原因它没有出现 如果您丢失了私钥 它将永远消失 除非您有备份 如果您可以
  • 从字符中获取 KeyCode?

    我需要能够读取字符并获取与其语言和键盘布局相关的键 我知道如何看待文化背景和语言 但是我怎样才能知道像英语中的 S 这样的字母并且知道它在键盘上是什么键呢 或者对于更难的问题 我如何取出字母 并知道它在键盘上的键是什么 用一个示例程序可能比
  • Python 字典键中的空格

    我知道 Python 字典键中可以有空格 但这被认为是糟糕的编程吗 我在 PEP 中找不到任何与此相关的内容 编辑以澄清 在我正在做的一个项目中 我正在研究解析 Apache 的记分板输出的东西mod status 请参阅下面的示例输出 我
  • PHP:数组的索引、元素、键、值之间有区别吗?...它们是同一件事吗?

    当处理PHP arrays 我经常在这里使用这样的术语 Array Key Array Index Array Element Array Value 有人可以吗 PLEASE in simple术语解释了其中每一个的含义基本上 means
  • 如何使用包含空格的键从Redis获取值?

    使用 telnet 我输入这样的命令行命令 get field with spaces get field with spaces get field with spaces 这三个都返回相同的错误 ERR wrong number of
  • 根据 Multimap Google Guava 中的键按升序对数据进行排序

    我创建了一个多重地图 Multimap
  • 在java中注入击键

    我正在寻找一种将击键注入操作系统键盘输入缓冲区的方法 就像当您单击一个按钮时 程序会插入一个 或多个 键盘敲击 我想在java中执行此操作 因为我想在 win linux和osx 中运行它 我想我必须利用 JNI 有人有什么想法吗 感谢所有
  • Python - 查找字典中最长(最多单词)的键

    有没有一种方法可以快速查询字典对象以找到单词最多的键 所有键都是字符串类型 即 如果具有最大键的项目有五个单词 这是最大的键 3 我如何快速查询字典并返回 int 5 最好的 乔治娜 这将为您提供密钥 max d key lambda x
  • 检查字典是否有多个键

    如何检查字典 实际上是类似字典的对象 是否具有给定集合的所有内容keys 复数 到目前为止 我已经使用过 d a 1 b 2 c 3 keys a b def has keys d keys for key in keys if not k
  • 在hbase中创建表

    我是 hbase 和 hadoop 的新手 无论如何 我已经成功建立了一个由3台机器组成的hadoop集群 现在我需要一些帮助来建立数据库 我有一个表 评论 包含字段 user id comments 对评论的评论 可以多个 和状态字段相同
  • Outlook 添加、文本框、删除\退格键不起作用

    我开发了一个 Outlook 插件 自定义任务窗格 在用户控件中带有 Web 浏览器 当我在网络浏览器的文本框中写入内容时 退格键或删除按钮旁边的所有功能都运行良好 但我无法使用这些键 我是否遗漏了什么 我迟到了几年 但我设法解决了这个问题
  • 在网站上以多种形式输入密钥

    我有一个有两种表格的网站 一个用于搜索 另一个用于登录 当我使用回车键提交时 搜索总是被调用 因为它是页面上的第一个表单 我想要做的是对回车键进行编程 以在某个文本框获得焦点时单击某个按钮 我使用 asp textbox 和 asp but
  • 如何向 Rails 中的表追溯添加主键?

    我创建了一个没有主键的表 id gt false 但现在它又回来了 我的应用程序已经投入生产 我不能只是放弃它并重新创建另一个应用程序 有没有办法运行迁移以将另一个自动增量主键列添加到我的表中 在迁移中添加主键的命令是 add column
  • 如何在 JavaScript 中访问“关联”数组的第一个键?

    我有一个 js 关联 数组 其中 array serial number value serial number 和 value 是字符串 例如array 20910930923 20101102 我按价值排序 效果很好 假设我取回了 已排
  • 返回不包括指定键的字典副本

    我想创建一个函数 返回字典的副本 不包括列表中指定的键 考虑这本词典 my dict keyA 1 keyB 2 keyC 3 致电without keys my dict keyB keyC 应该返回 keyA 1 我想用一行简洁的字典理

随机推荐

  • 尝试以特殊行为渲染 Threepenny-gui 中的字段

    我想要做的是设置字段 当它们处于焦点时显示详细信息 而当它们不处于焦点时显示摘要 例如 A 当它失去焦点 变得模糊 时 我将值保存在 状态 映射中 然后将该值更改为旧值的函数 即汇总值 b 当它获得焦点时 我用我在地图中保存的旧值替换摘要值
  • Emacs 关于 python 模式函数的默认提示

    在 python 模式下 有一个名为 py execute region 的函数 它将突出显示的代码区域发送到 Python 缓冲区进行评估 评估后 光标位于 Python 缓冲区中 但我希望它保留在脚本缓冲区中 以便我可以继续生成更多代码
  • 如何仅使用 jQuery 垂直调整 DIV 大小 - 无需插件?

    Edit 我把这段代码放在jsbin中 http jsbin com eneru http jsbin com eneru 我试图让用户使用 jQuery 调整 DIV 元素的大小 仅垂直 我读到了有关 jQuery UI 的内容 我尝试了
  • 某些 exe 中的 OpenFileMapping 访问被拒绝

    我有一个程序使用写入变量 CreateFileMapping INVALID HANDLE VALUE NULL PAGE EXECUTE READWRITE 0 sizeof data Local testtest 然后我将 dll 加载
  • 将文件列表传递给 grep

    我有一个文件中的文件列表 该列表很大 并且文件名是非标准的 这意味着 有些文件名包含空格 非 ascii 字符 引号 单引号 所以 通过那个huge不能选择将文件列表作为 grep 参数 因为我不确定我不会超过linux允许的参数长度 我想
  • Debian - /usr/bin/env: 'php\r': 没有这样的文件或目录

    所以当我跑步时 直接讨论问题 yii似乎我从 Debian stretch 中收到了从 Docker 运行的错误 然而当我跑步时 usr bin env php v我得到了正确的输出 没有问题 似乎新行被翻译为字符串时出现问题 我不知道如何
  • 我应该如何存储不同时区事件的数据?

    这是一个概念性问题 因此这里没有代码片段 假设我创建了一个事件数据库 其中一些在纽约 一些在芝加哥 一些在凤凰城 等等 我的服务器的时区设置为纽约 在我看来 为所有这些事件创建 UNIX 时间戳时有两种选择 考虑时区 即 1 月 1 日午夜
  • 查找数组中值最接近的对象

    我需要通过最接近的值获取数组中的对象 让我通过一个例子来解释一下 const data age 52 age 53 age 54 age 60 some data age 66 something else age 72 age 78 ag
  • Robot.delay(int) 与 Thread.sleep(long)

    我有一个程序 其唯一目的是驱动java awt Robot无限循环 直到满足退出条件 机器人快速连续执行多个动作 这需要它们之间有标准的 UI 延迟 为此 我使用java awt Robot setAutoDelay int ms 这似乎正
  • 在冒号后连接行 (perl)

    我有这样的行 alpha beta beta alpha beta omega beta gamma alpha gamma alpha beta gamma epsilon alpha 我想将仅包含一个单词的行加入冒号与不包含冒号的行 a
  • 圆半便士? [复制]

    这个问题在这里已经有答案了 可能的重复 向上舍入最接近的 0 10 https stackoverflow com questions 2206335 round up nearest 0 10 JavaScript 中的数字四舍五入到小数
  • Robolectric 和 Powermock 之间的类加载冲突

    我正在尝试编写一个需要两者的测试机器人电动2 2 和电源模拟 因为被测试的代码依赖于一些 Android 库和第三方库以及我需要模拟的最终类 鉴于我被迫通过以下方式使用 Robolectric 测试运行程序 RunWith Robolect
  • parApply 中的错误处理(在 R 中,使用并行包)

    我正在尝试解决尝试使用时收到的以下消息parApply函数从parallel包裹 Error in unserialize node con error reading from connection 以下是我正在做的事情的模型 c0 lt
  • 使用 Java API 从 Lotus Notes NSF 文件中提取电子邮件

    我想使用 Java API Notes jar 并且正在运行安装了 Lotus Notes 8 5 的 Windows 机器 我对 Lotus Notes 一无所知 我只需要完成一项狭窄的任务 从 NSF 文件中提取电子邮件 我希望能够遍历
  • 使用 Python 将方程渲染为 .png 文件

    我想将方程渲染为 PNG 文件并将它们嵌入到我的库的 HTML 文档中 我已经在其他项目中使用 pylab matplotlib 我还没有找到任何线索http matplotlib sourceforge net users usetex
  • 不懂 C 就开始学习 C#? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 是否建议只了解一点点 C 只是一些基础知识 或什至不了解 C 就直接跳到 C C 和 C 非常不同 它们共享语法 但编程风格却截然不同 学习 C
  • 我可以使用反射在类中添加新字段吗

    如果我有类文字对象 我可以向类添加新字段吗 如何确定该类文字中引用或使用了特定的类 您不能直接向其中添加新字段Class目的 您可以使用第三方 API 来生成或修改类 例如 ASM BCEL 但最好避免使用它们 因为它们会增加很多复杂性 至
  • WebRTC:强制对等点使用 TURN 服务器

    我有一个 webrtc 应用程序 它工作正常 但出于测试目的 我需要测试我的 TURN 服务器是否工作 但因为两个测试设备都在同一网络内 所以我无法测试 认为下面的代码会限制候选人仅那些使用 TURN 服务器的 function onIce
  • 使用 boost asio 枚举我的卡的 ipv4 和 ipv6 地址

    我正在尝试枚举我的电脑的所有网卡 我有 2 张卡 的 ipv4 和 ipv6 地址 我正在使用以下代码来执行此操作 using boost asio ip tcp boost asio io service io service tcp r
  • Pkcs11Interop 从 HSM 读取密钥值

    我正在尝试使用 Pkcs11Interop 从 HSM 中提取密钥的值 我知道 密钥必须留在 HSM 中 但我需要它 所以 我已经用 NCryptoki 做到了 我也想用 Pkcs11Interop 做到这一点 我尝试了这段代码 Prepa