如何使用 Python 将特定数据写入智能卡

How to write specific data to a smart card using Python

在我的项目中,我尝试使用智能卡为特定数据创建数字签名。

我正在使用智能卡 reader ACR38U-I1 和 Linux OS(更准确地说是 Raspbian OS)

我已经安装了此设备所需的所有驱动程序和其他库,例如 pcsc、pcsc-lite ...

我还得到了 private/public gpg 密钥对来制作数字签名。 据我了解使用智能卡进行数字签名的概念,我必须将私钥写入这张卡并在需要创建签名时读取它。

在这种情况下,我遇到了一个问题,我不知道该怎么做。

我打开了 pcsc-lite 文档 [1],但找不到如何将数据写入卡的写入方法或示例 https://pcsclite.alioth.debian.org/api/group__API.html[1]

如果有人能指导我正确的方法,我将不胜感激。

典型的方法是:

  • 生成智能卡上的密钥(对);这样做的好处是,任何恶意软件都无法获取私钥,因为它永远不会离开卡。

  • 发送命令生成卡片签名,例如用要签名的数据的哈希值

读取 智能卡中的密钥会丢弃智能卡提供的所有安全性。生成签名的最常见方法是使用 PKCS 11 软件,但 Raspbian 可能很难找到一个。我建议找一张 GPG 直接支持的卡。这样您就不需要详细了解所有必要的主题。

(本来想写评论的,但是写的有点长。。。)

(编辑:写这篇文章时我没有意识到你在非 x86 环境中工作,所以这个答案可能没用,除非你可以选择 x86(也许是英特尔爱迪生?))

这不是解决方案,但可能是一个好的方向(我对这张卡没有经验):

有个PKCS#11 driver for the card which probably provides some access to its services (pkcs11 is a standardized API to access cryptographic tokens, see here).

有了这个 驱动程序(假设它可以工作并提供适当的机制),您有一些选择可以继续:

  • 直接从 c 代码使用它(对我有效)

  • 使用python wrapper(没有这种方式的经验,但你的问题暗示需要python)

  • 使用 openssl(参见 here or here——这在一段时间前对我有用)

  • 将它与 gpg 一起使用(从未尝试过,根本不会推荐)


首先验证 pkcs11 驱动程序是否正常工作可能是个好主意(您可以使用 firefox 浏览器执行此操作,参见 here)。


补充说明:

  • 我建议初始化卡并使用供应商提供的实用程序生成密钥,并仅使用 pkcs11 驱动程序实际签署一些数据(这种方式避免了许多麻烦的部分)。

  • 为 pkcs11 和相关内容做 google,这个 "extended comment" 只是另一个 "point of view"

祝你好运!