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)

    目录

    简介

    FIPA协议约定

    本协议约定

    简单授权登录

    同设备交互登录场景

    不同设备二维码扫描登录场景

    数据结构

    登录请求应用验证

    简介

    
    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. 本协议约定私钥管理应用为其他应用授权登录的方式和数据格式;

    2. “私钥管理应用”指管理用户私钥,为其他应用提供授权登录服务的应用。“登录请求应用”指发出申请,验证用户登录信息的应用。

    3. 授权方式包括:1)单向签名登录(aid、ip、time);2)同设备双向签名登录(aid、time、address);3)二维码双向签名登录(aid、address、returnUrl);

    确认:

    1. aid 或 reqester (name,url)。登录方确认是登录自己的签名。签名者确认是自己要登录的应用;链上注册应用采用aid,非链上注册应用采用name或url,要求app和签名者都认知。
    2. IP,登录方确认登录着网络位置;签名者确认是自己的网络位置;
    3. 时间戳,登录方确认申请登录的时间,防止重放攻击。
    4. address; 登录方确认登录身份,签名者确认自己的身份;

    单向签名登录

    当用户确定所登录应用可信时,可以仅对应用提供的随机码签名,验证后登录。

    流程

    1. 用户提供要登录的身份,cid或fch地址,申请登录;
    2. 登录请求应用 出示随机码文本和二维码,并设定随机码有效期(如3分钟);
    3. 用户复制或扫描随机码,填入到私钥签名应用中签名,产生签名文本或二维码
    4. 用户将签名信息填入登录请求应用,确认登录;
    5. 登录请求应用 验证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. //签名者与申请者不一致或未授权
    

    钓鱼攻击警告

    简易签名登录不能验证申请者身份,用户登录时,可能面临钓鱼攻击:

    1. A向伪装应用C申请登录B;
    2. C用A的地址向B申请登录B;
    3. B向C出示随机码;
    4. C向A出示该随机码
    5. A对随机码签名返回给C
    6. C用该签名登录A在B的账户,完成攻击。

    采用简易签名登录需提醒用户,确认登录应用是否可信。

    同一设备应用间授权登录

    登录请求应用私钥管理应用在同一设备时,直接在设备内交互信息完成登录。

    流程图

    未命名文件(14).png

    流程说明

    1. 用户在登录请求应用填写登录信息,即CID或FCH地址;
    2. 登录请求应用构造登录数据,其中user.signature为空;
    3. 登录请求应用唤醒私钥管理应用,并提交登录数据;
    4. 私钥管理应用验证登录数据的签名和登录请求应用身份,参见登录请求应用的身份验证;
    5. 私钥管理应用验证成功则展示待签名信息给用户,验证失败则返回错误信息给登录请求应用,参见返回错误;
    6. 用户审查私钥登录应用的签名提示,内容无误后确认签名;
    7. 私钥管理应用接到用户确认后使用相应私钥签名登录数据;
    8. 私钥管理应用添加user.signature值后将登录数据返回给登录请求应用;
    9. 登录请求应用收到登录数据进行验证,成功则准许登录,失败则提示用户登录失败。

    不同设备二维码扫描登录场景

    一台设备的登录请求应用展示登录信息二维码,私钥管理应用从另一台设备扫描该二维码,验证后完成签名登录。

    流程图

    未命名文件(12).png

    流程说明

    1. 用户在登录请求应用填写登录信息,即CID或FCH地址;
    2. 登录请求应用构造登录数据,其中user.signature为空,参见登录数据;
    3. 登录请求应用构造二维码,包含:1)登录数据url 和 2)确认登录url。参见二维码数据格式;
    4. 用户启动私钥管理应用,扫描上述二维码;
    5. 私钥管理应用验证登录数据的签名和请求者身份,参见登录请求应用的身份验证;
    6. 私钥管理应用验证成功则展示待签名信息给用户,验证失败则返回错误信息给登录请求应用,参见返回错误;
    7. 用户审查私钥登录应用的签名提示,内容无误后确认签名;
    8. 私钥管理应用接到用户确认后使用相应私钥签名登录数据;
    9. 私钥管理应用添加user.signature后,将登录数据通过确认登录url传递给登录请求应用;
    10. 登录请求应用收到登录数据进行验证,成功则准许登录,失败则提示用户登录失败。

    数据结构

    登录数据

    字段名 类型 说明 备注
    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]" 
        }
    }
    

    登录请求应用的身份验证

    1. 三种登录申请
      requstor指的是登录请求应用,分为三类:
    • CID:应用在链上注册的CID或其链上授权的CID;
    • SID:某CID在链上发布的服务的id,即发布该服务的交易id,参见FEIP29V1_Service;
    • URL:其他互联网来源。
    1. 私钥管理应用验证登录请求应用的身份

    私钥管理应用收到前且登录请求时,应当验证签名是否正确,并且验证“requester”信息与“app”的签名信息是否一致:

    • requester为CID时,验证CID对应地址应与app.address是否一致;
    • requester为SID时,验证SID的发布地址应与app.address是否一致;
    • requester为url时,则该url应在可信方绑定了FCH地址或CID,并与app.address一致。

Log in to reply