登录至 projectGDT 平台

RSA 密钥的生成与分发

服务端启动时,生成一个 RSA 密钥对

客户端发送 GET https://<daemon-host>/RSA-PublicKey 请求公钥;daemon 返回以 json 形式包装的 RSA 公钥。

玩家

  1. 玩家在网页端填写用户名 (UID 或 QQ 号) 和密码。

  2. 浏览器获取 RSA 公钥,将密码用该公钥加密。

  3. 浏览器发送请求,提交用户名和 RSA 加密后的密码,建立 WebSocket 连接。

  4. daemon 将密码用私钥解密。

  5. daemon 使用 PBKDF2 算法对解密后的用户密码取 hash,并与存储在数据库中的用户名、密码 hash 相比较,确定认证是否成功,若成功则接受并建立连接。

  6. 若连接成功建立,daemon 会向浏览器发送以 json 形式包装的 sessionKey,该 key 在 WebSocket 连接存在期间有效。随后通过 HTTP 请求执行的任何查询和提交操作均需要该 sessionKey。若连接被拒绝,则一定是因为账户不存在或密码错误。

服务器

  1. 服务端插件从配置文件读取 token

  2. 服务端插件获取 RSA 公钥,将 token 用该公钥加密。

  3. 服务端插件发送请求,提交 token,建立 WebSocket 连接。

  4. daemon 将 token 用私钥解密。

  5. daemon 将请求源 IP 与 token 与数据库中存储的数据相比较,确定认证是否成功,若成功则接受并建立连接。

  6. 若连接成功建立,daemon 会向浏览器发送以 json 形式包装的 sessionKey,该 key 在 WebSocket 连接存在期间有效。随后通过 HTTP 请求执行的任何查询和提交操作均需要该 sessionKey。若连接被拒绝,则一定是因为 token 错误。

Last updated