作为一个学习项目,我正在尝试建立一个类似于我们在荷兰的冠状病毒疫苗QR码应用程序的项目。我对处理这些敏感/私人数据的最安全方法有一些疑问。
所以我有一个工作流程,我想在这里列出,并征求你的意见。我相信我可以在工作流程中使用JWT。据我所知,JWT既可以签名也可以加密。也许两者都有,我不确定。我想我需要一个加密的和签名的JWT。我不完全了解签名和加密是如何工作的,所以我不知道它们的限制是什么。总之,我们有:
- 为人们接种疫苗的机构。
- 接种疫苗的人。
- 希望能够验证某人是否接种了疫苗的人。 最后是我的后端服务器。
简而言之,我将它们分别称为接种者、被接种者、验证者和服务器。以下是我认为最安全的工作流程:
- 接种者在手机上下载我的应用程序。
- 接种者接种疫苗,然后被告知在他们的手机上打开我的应用。
- 如果这是第一次打开应用程序,那么:
- app生成公钥/私钥对
- 应用程序用它的公钥向
https://myserver.com/api/register
发送POST请求。 - 服务器为该设备生成一个新的唯一id,将其与它们的公钥一起存储在数据库的
users
表中,并返回带有它们的id的响应。表现在看起来像这样:
vaccination_data
这是一个使用HMAC和PKI的经典用例。您有两个不受信任的实体(接种者和事件组织者),它们需要基于它们都信任的更高权威(类似于TLS证书信任的工作方式)在它们之间形成单向信任关系
- 后端服务器存储一个公私对,公钥与每个想要验证疫苗接种证明的实体共享。
- 当用户接种疫苗时,他提供他的电话号码并通过短信获得数字签名文件。
- 该文档使用第1条中提到的私钥进行签名,并包含您想要验证的数据(这是一个签名的JWT,即JWS)
- 文档可以编码为QR码图像
- 验证可以通过不同的应用程序完成,该应用程序从服务器预取公钥(因此不需要在线),扫描QR,解码并使用公钥进行验证。