如何使用 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 Flask如何开发以太坊智能合约

如何使Python多处理池工作以写入相同的日志文件

如何在python 3中有效地将原始字节写入numpy数组数据

如何使用Java卡在智能卡中写入文件

将新数据添加到特定子项时如何使用 Cloud Functions 将数据写入 Firebase 实时数据库

如何实时读取/写入原始音频数据(使用python)?