FIPA7V1_LoginWithSignature(en-US)
-
FIPA7: LoginWithSignature Version: 1 Language: en-US Author: master_wang, C_armX, Deisler-JJ_Sboy Status: draft Created date: 2021-05-30 Last modified date:2021-08-31 File hash: unknown Txid: Unpublished
FIPA7V1_LoginWithSignature(en-US)
目录
简介
Protocol type: FIPA Serial number: 7 Protocol name: 授权登录 Version: 1 Description : 私钥管理的应用为其他应用提供授权登录服务。 Author: master_wang, C_armX, Deisler-JJ_Sboy Language: zh-CN Tags: FIPA, 签名,登录 PreVersion hash:
FIPA协议约定
FIPA协议规定不需要Freecash主网硬分叉升级即可实施,并且不涉及主链数据或分布式存储数据格式的改进协议。
本协议约定
-
本协议约定私钥管理应用为其他应用授权登录的方式和数据格式;
-
“私钥管理应用”指管理用户私钥,为其他应用提供授权登录服务的应用。“登录请求应用”指发出申请,验证用户登录信息的应用。
-
授权方式包括:1)单向签名登录(aid、ip、time);2)同设备双向签名登录(aid、time、address);3)二维码双向签名登录(aid、address、returnUrl);
确认:
- aid 或 reqester (name,url)。登录方确认是登录自己的签名。签名者确认是自己要登录的应用;链上注册应用采用aid,非链上注册应用采用name或url,要求app和签名者都认知。
- IP,登录方确认登录着网络位置;签名者确认是自己的网络位置;
- 时间戳,登录方确认申请登录的时间,防止重放攻击。
- address; 登录方确认登录身份,签名者确认自己的身份;
单向签名登录
当用户确定所登录应用可信时,可以仅对应用提供的随机码签名,验证后登录。
流程
- 用户提供要登录的身份,cid或fch地址,申请登录;
- 登录请求应用 出示随机码文本和二维码,并设定随机码有效期(如3分钟);
- 用户复制或扫描随机码,填入到私钥签名应用中签名,产生签名文本或二维码
- 用户将签名信息填入登录请求应用,确认登录;
- 登录请求应用 验证1)随机码在有效期内,2)签名地址与登录地址一致,3)签名有效,成功则准许登录。
返回错误
{ "errorCode":[int, 为0表示成功,非0表示失败], "errorMessage":"[字符串,当errorCode非0时,标识失败原因]" }
错误代码与含义:
200 Request for signature timed out. //随机码过期,申请签名超时 201 The signature used for the application failed verification. //申请签名未通过验证 202 The signer and the requester are inconsistent or not authorized. //签名者与申请者不一致或未授权
钓鱼攻击警告
简易签名登录不能验证申请者身份,用户登录时,可能面临钓鱼攻击:
- A向伪装应用C申请登录B;
- C用A的地址向B申请登录B;
- B向C出示随机码;
- C向A出示该随机码
- A对随机码签名返回给C
- C用该签名登录A在B的账户,完成攻击。
采用简易签名登录需提醒用户,确认登录应用是否可信。
同一设备应用间授权登录
登录请求应用与私钥管理应用在同一设备时,直接在设备内交互信息完成登录。
流程图
流程说明
- 用户在登录请求应用填写登录信息,即CID或FCH地址;
- 登录请求应用构造登录数据,其中user.signature为空;
- 登录请求应用唤醒私钥管理应用,并提交登录数据;
- 私钥管理应用验证登录数据的签名和登录请求应用身份,参见登录请求应用的身份验证;
- 私钥管理应用验证成功则展示待签名信息给用户,验证失败则返回错误信息给登录请求应用,参见返回错误;
- 用户审查私钥登录应用的签名提示,内容无误后确认签名;
- 私钥管理应用接到用户确认后使用相应私钥签名登录数据;
- 私钥管理应用添加user.signature值后将登录数据返回给登录请求应用;
- 登录请求应用收到登录数据进行验证,成功则准许登录,失败则提示用户登录失败。
不同设备二维码扫描登录场景
一台设备的登录请求应用展示登录信息二维码,私钥管理应用从另一台设备扫描该二维码,验证后完成签名登录。
流程图
流程说明
- 用户在登录请求应用填写登录信息,即CID或FCH地址;
- 登录请求应用构造登录数据,其中user.signature为空,参见登录数据;
- 登录请求应用构造二维码,包含:1)登录数据url 和 2)确认登录url。参见二维码数据格式;
- 用户启动私钥管理应用,扫描上述二维码;
- 私钥管理应用验证登录数据的签名和请求者身份,参见登录请求应用的身份验证;
- 私钥管理应用验证成功则展示待签名信息给用户,验证失败则返回错误信息给登录请求应用,参见返回错误;
- 用户审查私钥登录应用的签名提示,内容无误后确认签名;
- 私钥管理应用接到用户确认后使用相应私钥签名登录数据;
- 私钥管理应用添加user.signature后,将登录数据通过确认登录url传递给登录请求应用;
- 登录请求应用收到登录数据进行验证,成功则准许登录,失败则提示用户登录失败。
数据结构
登录数据
字段名 类型 说明 备注 message object 消息体 message.requester string 请求者 address, cid、sid(服务)或url message.operation string 操作请求:"login" message.timestamp timestamp 申请登录时间戳 Unix time格式 message.parameter object 操作参数 登录应用自定义 app object 登录应用签名区域 app.address string 登录应用地址 app.signature string 登录应用签名 请求方私钥对message的值签名 user object 用户签名区域 user.address string 用户地址 user.signature string 用户签名 用户私钥对message的值签名 json示例
{ "type": "FIPA", "sn": 7, "ver": 1, "data": { "message": { "requester": "[address, cid, sid or url]", "operation": "login", "timestamp": [unix timestamp], "parameters": {[由登录请求应用自定义]} }, "app": { "address": "[FCH address of the app]", "signature": "[signature of message signed by the private key of the address]" }, "user": { "address": "[FCH address of the user]", "signature": "[对message的值的签名]" } } }
返回错误
{ "errorCode":[int, 为0表示成功,非0表示失败], "errorMessage":"[字符串,当errorCode非0时,标识失败原因]" }
错误代码与含义:
100 The private key was not found. //没找到对应私钥 101 User refused to sign. //用户拒绝签名 200 Request for signature timed out. //申请签名超时 201 The signature used for the application failed verification. //申请签名未通过验证 202 The signer and the requester are inconsistent or not authorized. //签名者与申请者不一致或未授权
二维码数据
{ "type": "FIPA", "sn": 7, "ver": 1, "data": { "op": "login", # 表明此二维码数据用于传递登录信息 "dataUrl": "[获取登录数据的url]", "confUrl": "[返回确认登录信息的url]" } }
登录请求应用的身份验证
- 三种登录申请
requstor指的是登录请求应用,分为三类:
- CID:应用在链上注册的CID或其链上授权的CID;
- SID:某CID在链上发布的服务的id,即发布该服务的交易id,参见FEIP29V1_Service;
- URL:其他互联网来源。
- 私钥管理应用验证登录请求应用的身份
私钥管理应用收到前且登录请求时,应当验证签名是否正确,并且验证“requester”信息与“app”的签名信息是否一致:
- requester为CID时,验证CID对应地址应与app.address是否一致;
- requester为SID时,验证SID的发布地址应与app.address是否一致;
- requester为url时,则该url应在可信方绑定了FCH地址或CID,并与app.address一致。
-