如何使用 Python 将特定数据写入智能卡
Posted
技术标签:
【中文标题】如何使用 Python 将特定数据写入智能卡【英文标题】:How to write specific data to a smart card using Python 【发布时间】:2015-11-12 06:59:40 【问题描述】:在我的项目中,我尝试使用智能卡为特定数据创建数字签名。
我正在使用智能卡读卡器 ACR38U-I1 和 Linux 操作系统(更准确地说是使用 Raspbian 操作系统)
我已经安装了此设备所需的所有驱动程序和其他库,例如 pcsc、pcsc-lite ...
我还获得了用于制作数字签名的私有/公共 gpg 密钥对。 据我了解使用智能卡进行数字签名的概念,我必须将私钥写入此卡并在需要创建签名时读取它。
在这种情况下,我遇到了一个我不知道该怎么做的问题。
我打开了 pcsc-lite 文档 [1] 并找不到如何将数据写入卡的写入方法或示例 https://pcsclite.alioth.debian.org/api/group__API.html[1]
如果有人能指导我正确的方式,我将不胜感激。
【问题讨论】:
根据我理解使用智能卡进行数字签名的概念,我必须将私钥写入此卡并在需要创建签名时读取它。 - 那是不是智能卡应该如何用于签名。是的,您将私钥写入卡上。但它应该是卡上一个只能写入的区域,密钥只能由卡上生成签名的应用程序使用。 你的意思是我必须编写一个将在智能卡上执行的应用程序?我想我可以在使用这个智能卡读卡器的应用程序中做到这一点。有可能吗? 我认为我可以在使用此智能卡读卡器的应用程序中做到这一点。有可能吗? - 如果您的智能卡为您提供这样的读/写数据仓,您可以这样做。但在那种情况下,智能卡将无法提供人们期望的智能卡的安全性。硬盘驱动器上的 PKCS12 文件将提供同样小的安全性。 你用的是哪张卡? 【参考方案1】:典型的方法是:
生成智能卡上的密钥(对);这样做的好处是,没有恶意软件能够获取私钥,因为它永远不会离开卡。
发送命令为卡生成签名,例如用要签名的数据的哈希值
读取智能卡中的密钥会丢弃智能卡提供的所有安全性。生成签名的最常见方法是使用 PKCS 11 软件,但可能很难为 Raspbian 找到一个。我建议找一张 GPG 直接支持的卡。这样您就无需详细了解所有必要的主题。
【讨论】:
根据gnupg-pkcs11.sourceforge.net/man.html gpg 协议与 PKCS 11 兼容。在这种情况下,我的智能卡也应该支持 pgp。 但是当我在终端运行命令 gpg --card-status 时,它会检测到我的读卡器,但看不到插入的智能卡 @tequila:从这些事实我可以得出结论,gpg 不支持您的卡。顺便说一句,对于刚出厂的卡片,这是可以预料的。您需要一个功能强大的平台和适当的个性化。首先,请参阅specification。【参考方案2】:(想写评论,但是写的有点长……)
(编辑:在写这篇文章时,我没有意识到你是在非 x86 环境中工作,所以这个答案可能没用,除非你可以选择 x86(也许是英特尔爱迪生?))
这不是一个解决方案,但可能是一个很好的方向(我对这张特殊的卡片没有经验):
卡有一个PKCS#11 driver,可能提供对其服务的一些访问(pkcs11 是访问加密令牌的标准化 API,请参阅 here)。
有了这个驱动程序(假设它可以工作并提供适当的机制),你有一些选择可以继续:
直接从c
代码中使用它(对我有用)
使用python wrapper(没有这种方式的经验,但您的问题暗示需要python)
使用 openssl(例如,参见 here 或 here -- 这在前一段时间对我有用)
与gpg 一起使用(从未尝试过,完全不推荐)
首先验证 pkcs11 驱动程序是否正常工作可能是个好主意(您可以使用 firefox 浏览器进行验证,请参阅例如here)。
补充说明:
我建议初始化卡并使用供应商提供的实用程序生成密钥,并仅使用 pkcs11 驱动程序来实际签署一些数据(这样可以避免很多麻烦的部分)。
google pkcs11 和相关的东西,这个“扩展评论”只是另一种“观点”
祝你好运!
【讨论】:
非常感谢!我已经将 PyKCS11 安装到我的 raspbian 操作系统(Python 上 PKCS 11 的包装器)。并且会朝着这个方向前进 @Tequila 我已经用谷歌搜索了this 和this——也许opensc-pkcs11.so
将能够处理你的令牌(所以你不需要来自供应商页面的 pkcs11 驱动程序仅适用于 x86)。以上是关于如何使用 Python 将特定数据写入智能卡的主要内容,如果未能解决你的问题,请参考以下文章
如何在python 3中有效地将原始字节写入numpy数组数据