Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【提案】 安全模块限制 #209

Open
4 tasks
waterbang opened this issue Aug 15, 2024 · 2 comments
Open
4 tasks

【提案】 安全模块限制 #209

waterbang opened this issue Aug 15, 2024 · 2 comments

Comments

@waterbang
Copy link
Collaborator

waterbang commented Aug 15, 2024

  • 需要针对app进行安全限制,防止app违法而被下架。
  • bundle_signature
  • public_key_url
  • dweb_signature

app进行安全限制

正式应用只允许挂载到有IPC备案应用安装中心进行安装。

bundle_signature

格式为 hex:{signature}
生成方式为:signature = sign(algorithm, "{app_id}:{bundle_hash}", private_key)
验证方式为:success = verifiy(algorithm, "{app_id}:{bundle_hash}" , public_key,signature)

public_key_url

该字段将会用于验证应用持有者的身份
该链接必须使用和app-id同域名的网站链接,
请求回来是一个“算法+公钥地址”的格式 "{algorithm}:hex;{publicKey}",比如说 rsa-sha256:hex;5394efaada3a24b624f098385496a85044a9ebb40dbc5f3ce945d3466d899121
请求回来的是公钥json。

dweb_signature

新增dweb_signature:string,metadata.json 内容进行签名。
该字段也是通过 私钥对hash 签名,通过 public_key_url 请求的公钥验证

上述签名算法将使用 ECDSA (Elliptic Curve Digital Signature Algorithm)(基于椭圆曲线密码学 (ECC) 的数字签名算法)

@waterbang
Copy link
Collaborator Author

ECDSA key example

  • public_key
{
    "crv": "P-256",
    "ext": true,
    "key_ops": [
        "verify"
    ],
    "kty": "EC",
    "x": "U7uuf8JvwW1Ph5yuQk-4jRuHdBPb3Me_koP22CskEKw",
    "y": "er0piIbBzGKI8yXt3Jt53Bhr4TyuTx8WGMpOtk5xN_k"
}
  • private_key
{
    "crv": "P-256",
    "d": "1eQRkpP_wpVPIT0ksrihZFQSmCZyODQhxZcKnbagFAA",
    "ext": true,
    "key_ops": [
        "sign"
    ],
    "kty": "EC",
    "x": "N-kwtatqOClcrN56MUgGdKsMaq7B8fc7a7ks05URaO0",
    "y": "w3cM8fmuD53ZnOdTcSaNdyH8k6pDj5RrnZpo9VcmZV8"
}

@Gaubee
Copy link
Contributor

Gaubee commented Aug 29, 2024

  1. dweb://install添加原生的 i18n 支持
    1. 新增 mode 参数,为 i18n 时,会根据当前 DwebBrowser 所处的语言环境进行自动选择
    2. mode 参数向下兼容,缺省为 manifest,意味着将 url 输入的链接当作 manifest 来处理
    3. 新增 IDWebView.UserAgentBrandData("install", "2"),来告知浏览器 dweb://install 支持 mode 配置
  2. 公私钥生成与读取工具 dwebkeygen [--version=1] [--payload=] *.dwebkey.json
    interface DwebKeyV1 {
      version: 1;
      public_key: "HEX";
      private_key: "HEX";
    }
    type DwebKey = DwebKeyV1;
    1. payload 字段为选填,如果为空,那么就随机生成。如果填写一样的 payload 内容,那么会输出一样的 dwebkey.json 文件,所以可以用它来稳定生成您的密钥
  3. 签名工具 dwebsign [--format=json] *.json [-o *.json] --key=hex|*.dwebkey.json [--version=1]

    签名工具的目的是让 dweb 知道这个文件没有被篡改

    1. 以上参数都可以写在配置文件中,我们会调用翻译服务进行,翻译服务可以进行配置,也可以用命令行参数来支持
      1. 支持 -c custom-config.json,并读取指定配置文件中的dwebsign字段来应用配置。
        1. 如果没有 dwebsign 字段,那么会直接尝试读取 key 等配置字段
      2. 默认读取 dwebsignrc.json 文件
    2. format 参数意味着如何解析输入文件,默认会根据文件后缀进行切换。目前默认只支持 json
    3. json 格式下,签名工具会在文件内添加 dweb_sign 字段
      interface DwebSignatureV1 {
        version: 1;
        public_key: "HEX";
        signature: "HEX";
      }
      type DwebSignature = DwebSignatureV1;
      interface JsonWithDwebSignature {
        dweb_sign: DwebSignature;
      }

      目前第一版本,使用 Ed25519 算法进行签名

  4. 自动翻译工具 dwebtranslate --mode=manifest *.json --from=zh --to=en,ja --outdir=i18ndir [--server-api-key=]
    1. 以上参数都可以写在配置文件中,我们会调用翻译服务进行,翻译服务可以进行配置,也可以用命令行参数来支持
      1. 支持 -c custom-config.json,并读取指定配置文件中的dwebtranslate字段来应用配置。
        1. 如果没有 dwebtranslate 字段,那么会直接尝试读取 to/from 等配置字段
      2. 默认读取 dwebtranslaterc.json 文件
    2. 这里的 --mode=manifest 意味着翻译模式,就是将 json 文件当成 manifest 格式来处理,那么就会只针对该文件中必要的字段进行翻译
    3. 输出的文件夹中,会有一个 manifest.i18n.json 的文件,它会枚举这个文件夹中的其它多语言文件
      type ISO_6391_1 = "zh_CN" | "en_US" | "...";
      interface ManifestI18n extends JsonWithDwebSignature {
        ".": {
          version: 1;
          baseUrl?: string;
        };
        [lang: ISO_6391_1]: string;
      }
      1. 目前第一版本,使用 ISO 639-1 标准来制定 lang
  5. web 插件 @dweb-browser/dweb-install:
    import { dwebInstall } from "@dweb-browser/dweb-install";
    dwebInstall.manifest("./manifest.json");
    dwebInstall.i18n("./manifest.i18n.json");
    1. dwebInstall.manifest 会自动补全链接,并拼接成 dweb://install?url=https://xxx.json
    2. dwebInstall.i18n 会判断当前 dwebBrowser 是否支持 dweb://install?mode=i18n
      1. 如果支持,那么直接拼接成 dweb://install?mode=i18n&url=https://xxx.json
      2. 如果不支持,使用兼容模式,会自己在浏览器中下载指定的manifest.i18n.json文件,然后解析出所需的manifest.lang.json文件,再去调用 dweb://install?url
      3. 兼容模式下,不会去校验manifest.i18n.json的签名合法性
  6. plaoc bundle 会自己完成 dwebkeygen dwebtranslate dwebsign 一系列的工作。

扩展

  1. dweb://open?id=terminal.browser.dweb
    install --url=xxx
    dwebkeygen --payload=xxx # dweb://dwebkeygen?payload=xxx
  2. toolikt.dweb-browser.org.dweb
  3. dwebbrowser.exe install url=xxx

    dweb://install?url=xxx

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants