V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
KasuganoSoras
V2EX  ›  分享创造

UChat:一个 PHP 开发的命令行聊天软件

  •  1
     
  •   KasuganoSoras ·
    kasuganosoras · 2019-03-03 06:10:01 +08:00 · 3821 次点击
    这是一个创建于 2117 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是一款使用 PHP 开发的命令行聊天软件,基于 UDP 协议

    本项目属于个人无聊写的作品,有不足的地方欢迎提 Issues 或者 Pull Request。

    我也不知道写来有啥用,而且类似的东西一大堆了,就自己写着玩吧

    项目地址: https://github.com/kasuganosoras/UChat

    附上一个可以直接运行的客户端: https://pan.baidu.com/s/1hdceQQ1RMYRo2ClnH3HK5g 提取码: qaas

    功能特性

    • 支持分组和私聊
    • 支持 AES-256-CFB 强加密传输
    • 支持抗重放攻击
    • 支持自定义服务器
    • 支持储存配置
    • 使用 UDP 协议
    • 支持断线重连

    基本介绍

    UChat 其实没有一个明确的分组或者私聊的概念,只要两个以上的用户使用相同的 key 连接服务器,就能一起聊天。

    例如用户 A 和用户 B 都使用 2333333 这个 Key 登陆到服务器,那么 A 和 B 就可以一起聊天。

    如果用户 A 使用 2333333 这个 Key,而用户 B 使用 6666666 这个 Key,那么 A 和 B 将无法聊天。

    实现原理

    用户在发送消息的时候,使用自己的 Key 加密消息内容,服务器收到加密的消息后不做任何处理,发送给所有的客户端,其他客户端收到加密的消息后,如果 Key 和发送者的 Key 相同,就可以解密消息内容,如果不相同则无法解密,自然就无法得到消息内容。

    于是呢,只要有另一个人的 Key 和你的 Key 相同,那么你们就可以互相看见对方发的消息,如果有很多人都使用一样的 Key,那就可以成为一个群组。

    img

    环境依赖

    运行服务端需要:Swoole、Redis

    运行客户端需要:Pthreads

    安装与运行

    首先将项目 clone 到本地,然后进入目录

    git clone https://github.com/kasuganosoras/UChat
    cd UChat/
    

    接着启动服务端,推荐在 screen 里运行,或者使用 nohup

    php server.php
    

    然后客户端也是同样的启动方式

    php client.php
    

    启动客户端以后根据提示设置即可。

    关于抗重放攻击

    比较鸡肋的一个功能,感觉可能有用就加上去了

    抗重放攻击使用系统时间进行验证,因此请确保聊天各方的时间相差不要超过 1 分钟,否则会验证失败。

    因为怕给大佬 DDoS,所以我就不放公共服务器地址了,各位有兴趣的话可以自己搭建一个服务器玩玩。

    如果觉得这个项目不错的话欢,迎给我一个 Star,谢谢~

    11 条回复    2019-03-05 13:51:49 +08:00
    xmlf
        1
    xmlf  
       2019-03-03 07:41:53 +08:00 via Android
    参数上带上 key,分享给其他人,不就可以和被分享的人加密聊天了吗?
    KasuganoSoras
        2
    KasuganoSoras  
    OP
       2019-03-03 07:52:11 +08:00
    @xmlf #1 是的,只要两个人有共同的 key 就可以加密聊天
    caqiko
        3
    caqiko  
       2019-03-03 10:05:01 +08:00 via Android
    没有 UI 图啊?我体验这种项目主要是看他够不够好看😊
    just1
        4
    just1  
       2019-03-03 10:12:21 +08:00 via Android
    那会不会有用户暴力尝试破解信息
    May725
        5
    May725  
       2019-03-03 11:37:35 +08:00 via iPhone
    @caqiko 真像了,有图时最直观的
    RicardoY
        6
    RicardoY  
       2019-03-03 14:44:35 +08:00 via Android
    这个应该比较适合一个小群体之间的交流吧...因为要转发所有消息...这样看起来这个 key 的功能就比较积累了呀..完全可以搭建多个服务器
    KasuganoSoras
        7
    KasuganoSoras  
    OP
       2019-03-03 15:48:52 +08:00 via Android
    @caqiko 命令行。。。哪来的 UI

    @just1 这个有考虑过,所以应该设置复杂一点的密码,只要密码够强基本上很难破解。

    @RicardoY 它的方便之处就在于,只要修改一下 key 就可以和另一个人聊天,而不需要再开一个服务器,节省资源。
    oldarm
        8
    oldarm  
       2019-03-03 16:03:55 +08:00
    good idea,还可以进一步完善
    ywisax
        9
    ywisax  
       2019-03-04 01:36:19 +08:00
    这个好东西
    yuanchao
        10
    yuanchao  
       2019-03-04 07:35:23 +08:00
    感觉不太对,Swoole 应该可以指定 Channel 吧?比如我的 key 为 123456,那么 Key 同样是 123456 的可以加入到一个 Channel,广播时指定 Channel 即可,不需要广播给所有客户端
    KasuganoSoras
        11
    KasuganoSoras  
    OP
       2019-03-05 13:51:49 +08:00
    @yuanchao #10 Key 是不会传输到服务端的,只是用于消息加密,因此服务端只能获得加密后的消息以及你的用户名。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5449 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 08:39 · PVG 16:39 · LAX 00:39 · JFK 03:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.