mirai-api-http icon indicating copy to clipboard operation
mirai-api-http copied to clipboard

【功能请求】希望可以让 执行命令 功能在 Session未认证 状态下也能执行命令

Open ATFGK opened this issue 3 years ago • 7 comments

现在如果没登陆QQ号,就无法执行命令 如果能让执行命令功能不被是否已经登陆QQ号限制就能用来登陆QQ了,还能实现下线QQ然后登陆另外一个QQ进行轮换

ATFGK avatar Oct 04 '22 09:10 ATFGK

下线轮换通过其他方式执行,执行命令不加认证过于危险

ryoii avatar Dec 12 '22 06:12 ryoii

下线轮换通过其他方式执行,执行命令不加认证过于危险

确实,但可以通过什么方式呢?

ATFGK avatar Dec 16 '22 02:12 ATFGK

找找有没有插件实现这个的,理论上不存在实现上的困难

ryoii avatar Dec 16 '22 12:12 ryoii

找找有没有插件实现这个的,理论上不存在实现上的困难

在现有的基础上,将传入的QQ参数设置为-1,或者专门创建一个接口,表示连接到Mirai控制台,这种状态将不能使用与QQ相关的API,只能控制Mirai控制台,相当于只连接到控制台。

当然必须通过身份认证(也就是mirai-api-http认证密钥),认证成功后,服务端返回一个会话密钥,通过会话的密钥才能进行控制mirai控制台

bunnyi116 avatar Aug 27 '23 20:08 bunnyi116

说到危险,mirai-api-http 身份认证也是极为不安全的,因为verifyKey和sessionKey是通过http(其中也包括websocket)中的url,请求头,和请求正文进行传递,如果你将它暴露在公网中,它会受到中间人攻击的,因为http是极不安全的,url,请求头,请求正文,在中间人眼里就是透明的是可获取的。

如果是考虑到安全的,我觉得先解决身份鉴权的安全性,协议上先考虑使用https/wss进行连接

bunnyi116 avatar Aug 27 '23 20:08 bunnyi116

如果还考虑使用http或ws,可以考虑先建立一个较为安全的连接RSA+AES环境,然后进行认证。不过这种方法也有办法绕过去,具体怎么绕我就不说了,只是说比http裸露的更安全一些至少他不是明文传输,所以还是得考虑https,和wss,因为证书会更安全

流程:

  1. 【服务端】生成一对 RSA 秘钥对,服务端保留私钥。将公钥由发送给客户端
  2. 【客户端】接收到服务端的 RSA 公钥后,然后客户端生成一个AES密钥。将AES密钥通过服务端RSA公钥进行加密成密文,然后将密文发给服务端
  3. 【服务端】收到密文使用 RSA私钥 将密文解密,得到客户端AES密钥,之后服务器将使用AES密钥与客户端交流。即服务端使用客户端生成的AES密钥加密需要的内容发送给客户端
  4. 【客户端】使用之前生成的 AES密钥解密 得到服务器传递的内容
  5. 【客户端】如果客户端后续有内容要传递给服务端,一样使用AES进行通讯,因为服务端客户端都拥有AES密钥

使用RSA+AES的原因:

  • 单纯的使用 RSA(非对称加密)方式的话,效率会很低,因为非对称加密解密方式虽然很保险,但是过程复杂,需要时间长;
  • 但是,RSA 优势在于数据传输安全,且对于几个字节的数据,加密和解密时间基本可以忽略,所以用它加密 AES 秘钥(一般16个字节)再合适不过了;
  • 单纯的使用 AES(对称加密)方式的话,死板且不安全。这种方式使用的密钥是一个固定的密钥,客户端和服务端是一样的,一旦密钥被人获取,那么,我们所发的每一条数据都会被都对方破解;
  • 但是,AES有个很大的优点,那就是加密解密效率很高,而我们传输正文数据时,正好需要这种加解密效率高的,所以这种方式适合用于传输量大的数据内容;
  • 基于以上特点,择优取之,就成就了混合加密的思路。

bunnyi116 avatar Aug 27 '23 20:08 bunnyi116

不安全指的是应用接口上的不安全,传输上的不安全可以套反代 TLS

ryoii avatar Sep 05 '23 10:09 ryoii