Irma:开源的基于属性的凭据

2021-01-24 03:35:43

IRMA是实施Idemix基于属性的凭据方案的一组免费和开源软件项目,可让用户在情况允许的情况下安全可靠地验证自己的身份,以保护隐私。用户从受信任的发行者处接收经过数字签名的属性,并将其存储在其IRMA应用程序中,之后用户可以有选择地向其他人公开属性。示意图:

使用属性上的发行者数字签名,验证者可以验证属性是在过去授予用户的,并且从那以后还没有被修改。

请求者后端和前端:通常,请求者在用户浏览器中运行一个带有(JavaScript)前端的网站,以及一个后端服务器。在IRMA会话期间,前端会显示IRMA应用程序扫描的IRMA QR。图表中描绘的所有前端任务均受irma-frontend支持。

通常,会话是由用户在网站上执行某些操作开始的(例如,单击"使用IRMA登录")。

请求者将其会话请求(包含要公开或发布的属性,或要签名的消息)发送给IRMA服务器。根据其配置,仅当来自授权请求者的会话请求是真实的(例如,有效签名的会话请求JWT)时,IRMA服务器才接受会话请求。

IRMA服务器接受请求,并为其分配会话令牌(随机字符串)。它返回前端必须显示的QR代码的内容:自身的URL和会话令牌。

前端(irma-frontend)接收并显示由IRMA应用程序扫描的QR码。

IRMA应用程序从步骤1请求会话请求,接收要公开或发布的属性,或要签名的消息。

IRMA应用程序显示要公开或发布的属性或要签名的消息,并询问用户是否要继续。

IRMA服务器使用IRMA应用程序执行IRMA协议,向用户发布新属性,或者从用户的IRMA应用程序接收和验证属性,或者接收并验证用户做出的基于属性的签名。的应用。

会话状态(“完成”,“已取消”,“超时”)以及根据会话类型公开和验证的属性或签名将返回给请求者。

这些任务中的哪一个由请求者的后端执行,哪个任务的前端因情况而异:通常,会话请求是由请求者的后端发送到IRMA服务器的,此后IRMA服务器步骤2中的答复将转发到前端,该前端将其呈现为QR码。但是,步骤1也可以由irma-frontend完成,在这种情况下,irma-frontend会在步骤2中自动获取IRMA服务器的答复并呈现QR码。

同样,在步骤10中,可以指示irma-frontend提取会话结果,但是也可以在后端进行。在后者中,如果需要,irma-frontend可以在您的后端获取自定义结果。

IRMA服务器可以与请求者的后端部署在同一台计算机上,但不一定要这样。它甚至可能不受请求者的控制。通常,步骤2/3和10是通过对IRMA服务器的REST HTTP调用完成的,但是如果使用irmaserver库,则这些步骤是函数调用。或者,您可以使用irma-backend-packages中的其中一个软件包,以其他编程语言中的函数调用来执行这些步骤。

在IRMA会话中,IRMA移动应用程序与IRMA服务器执行以下三种会话类型之一:

公开会话:从IRMA服务器接收到请求的属性列表后,如果应用程序用户同意,则该应用程序会将所需的属性公开给IRMA服务器,然后由IRMA服务器进行验证。

基于属性的签名会话:类似于公开会话,但是属性附加到经过数字签名的消息中,该消息被数字签名为基于属性的签名。基于属性的签名可以在以后的任何时间进行验证,以确保已签名的消息是完整的,并且附加到它的IRMA属性在创建基于属性的签名时是有效的。

发行会话:IRMA应用从IRMA服务器接收一组新的IRMA属性,包括有效的发行者签名,以用于以后的公开或基于属性的签名会话。 (可能还要求用户在接收新属性之前,在同一IRMA会话中也公开一些属性。这称为合并的发行-披露会话。)

IRMA会话流程一章中对此过程进行了示意性说明和更详细地说明。对于用户而言,在其IRMA应用程序中扫描QR后,公开会话通常如下所示。 (基于属性的签名会话和发布会话的流程相同(扫描qr,提供权限,成功屏幕);仅图形界面不同。)

网站上记录的各种现有软件组件都可以充当IRMA服务器的角色。除了公开IRMA应用程序在IRMA会话期间使用的API之外,这些组件中的每个组件还提供了一个可以启动和监视IRMA会话的API。 ,供请求者使用:希望向IRMA应用发布属性或从IRMA应用验证属性的一方。 IRMA服务器使用IRMA应用程序为请求者处理IRMA会话。

irma二进制文件的irma服务器命令:一个独立的守护程序,将其请求者API公开为HTTP端点。文件; API参考。

irmaserver Go库,公开了使用IRMA应用程序处理IRMA会话的HTTP服务器,以及用于启动和管理IRMA会话的Go函数。 文件; API参考。 IRMA使用JSON在IRMA会话中传递消息。 大多数IRMA用Go编写,并且JSON消息通常对应于特定的Go结构。 例如,irma服务器的GET / session / {token} / result端点输出server.SessionResult的实例。 在这种情况下,将包括指向相应Go结构的链接。 这可以告诉您可以使用或期望的字段。 (请注意,某些结构具有自定义(取消)编组器。另请参见JSON和Go上的Go文档。)