Minecraft(我的世界)中文论坛

 找回密码
 注册(register)
查看: 5661|回复: 38

[原创插件] [管理|安全] SakuraLogin 樱花登录 —— 支持外置登录的开源登录插件 [1.7.2-1.12.2]

[复制链接]
发表于 2018-3-6 18:34:21 | 显示全部楼层 |阅读模式
服务端插件
英文名称: Sakura Login
中文名称: 樱花登录插件
插件来源: 原创
适用服务端: |Cauldron| |CraftBukkit| |Spigot| 
插件类型: 综合 管理 安全 
语言支持: 简体中文 
适用版本: 1.12 1.11 1.10 1.9 1.8 1.7.10 1.7.2 
前置Mod|插件: 无前置插件
下载地址: https://panel.tcotp.cn/cdn/SakuraLogin/?s=SakuraLogin
原帖地址: https://www.moemc.cn/

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 Prismaillya 于 2018-8-28 17:28 编辑


    Sakura Login   更方便、更强大、更安全的开源登录插件


                               
登录/注册后可看大图
简介


                               
登录/注册后可看大图


这是一款支持外置登录的开源登录插件,后端使用 PHP 进行用户验证,可扩展性极强,支持与本人的 SoraChat 网页聊天插件对接数据库,实现一个账号登录服务器所有服务(论坛、博客、启动器等等,完全没有局限)部署这个插件之前,请先具备一些常规的电脑操作知识(不要再跑来问我 FTP 怎么上传之类的问题了...)以及足够的耐心,教程看似复杂,实际上部署起来只要几分钟的时间~

本插件只在 1.7.2 以上服务器进行测试过,理论上支持全版本,支持 Cauldron 和 KCauldron,不支持 Sponge

目前最高已经在 1.12.2 的 PaperSpigot 服务端上测试通过无异常,其他版本欢迎测试。


在此非常感谢 @andylizi dalao 提出的建议(详见二楼),经过考虑我认为这个传输过程中的加密毫无卵用,干脆就直接移除了

如果需要提升安全性,请使用 Nginx 为服务器做反向代理,并开启 SSL。

同时我将内置的简陋 Socket 换成了更好的 NicoHttp 核心,这是一个可以承受超大并发请求的 HTTP 服务器核心,已经在我的多款插件中应用,并且表现非常出色,目前本人的 Sakura Frp 主站的反向代理也是用的 NicoHttp 核心魔改。

网站方面,已经将原本的 AES-128-ECB 替换为 AES-256-CFB,加密时使用的密钥就是用户密码的 md5,向量 IV 就是用户密码的两次 md5,这样可以达到很好的安全性。

功能


                               
登录/注册后可看大图


  • 支持开启/关闭游戏内注册
  • 支持开启/关闭外置登录
  • 可从数据库读取玩家状态,拒绝被封禁玩家登录
  • 密码采用 AES-256-CFB 加密方式储存,这也是业界公认最安全的加密方式之一
  • 支持服务端/网页端分离,数据库分离
  • 完全可修改的语言文件(这个貌似没什么用)
  • 外置登录协议可二次开发
  • 不需要输入命令,进游戏直接在聊天栏输入密码即可登录


更新说明


                               
登录/注册后可看大图


1.2.0 — 移除了 AES-128-ECB 加密,改为 AES-256-CFB 加密,将 Socket 服务器改为更强大的 NicoHttp 核心。
1.1.8 — 更新加入外置登录 AES-128-ECB 加密支持,加入命令控制功能,开源
1.0.0 — 插件发布,最初始的功能

将新版本插件覆盖安装旧版本会自动更新配置文件。

命令


                               
登录/注册后可看大图


以下所有命令都需要权限:slogin.admin

命令 功能
/slogin help 显示插件帮助消息
/slogin reload 重新载入配置文件


安装


                               
登录/注册后可看大图


使用本插件非常简单,支持面板服(前提是服务商没有封掉所有未使用的端口,或者使用本人的 Sakura Frp)
通常您只需要以下几个东西:
  • 一个 Minecraft 服务器
  • 一个虚拟主机或 VPS(可以和 Minecraft 服务器搭在同一台 VPS 上以达到最佳效果,验证速度更快)
  • 如果您想要启用外置登录,您可能需要自己开发启动器或者找人定制(233333)


以下就是部署步骤:

  • 点击下载 SakuraLogin-1.2.Release.jar
  • 将下载好的 SakuraLogin-1.2.Release.jar 放入服务器的 plugins 文件夹
  • 重启一次服务器,自动生成 SakuraLogin 文件夹,编辑里面的 config.yml
  • 根据配置文件内的提示修改对应配置,然后重启服务器
  • 点击下载 SakuraLoginBackEnd-1.2.Release.zip 并开始配置网页端,此处有两个分支:

       5.1. 使用 VPS 或者独立主机部署后端
           5.1.1. 如果是 Windows 的服务器,推荐使用 phpStudy 一键环境包
           5.1.2. 安装完 phpStudy 后,打开,单击“其它选项菜单” > “网站根目录”
           5.1.3. 解压 SakuraLoginBackEnd-1.2.Release.zip,复制 login 文件夹到网站根目录
           5.1.4. 编辑 login/index.php,修改数据库用户名、密码、数据库名等
           5.1.5. 保存,进入服务器试试吧


           ————————————————————我系分割线——————————————————————


           5.1.6. 如果是 Linux 服务器,可以试试这个命令(把你的数据库密码改成你想设置的密码):
  1. wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz && tar xzf oneinstack-full.tar.gz && ./oneinstack/install.sh --nginx_option 1 --php_option 7 --phpmyadmin  --db_option 5 --dbinstallmethod 1 --dbrootpwd 你的数据库密码 --reboot
复制代码
           5.1.7. 然后它就会全自动开始安装 LNMP 了,安装完 OneinStack 后将会重启,重启完输入 cd /data/wwwroot/default/ 定位到网站根目录
           5.1.8. 输入命令 wget https://panel.tcotp.cn/cdn/SakuraLogin/?s=SakuraLoginBackEnd 下载后端文件
           5.1.9. 输入命令 unzip SakuraLoginBackEnd-1.0.Release.zip 解压
           5.1.10. 输入命令 vi login/index.php,按 a,然后修改数据库用户名,密码,数据库名
           5.1.11. 按下 Esc,然后输入 :wq 保存并退出


       5.2. 使用虚拟主机部署后端
           5.2.1. 打开 FTP 软件,推荐用 Windows 资源管理器自带的就行了,地址栏输入 ftp://服务器地址/ 回车
           5.2.2. 将 SakuraLoginBackEnd-1.2.Release.zip 解压
           5.2.3. 进入虚拟主机网站根目录,一般就是登陆上去以后的默认文件夹或者是 WWW、Web 文件夹
           5.2.4. 编辑 login/index.php,修改数据库用户名、密码、数据库名(一般虚拟主机后台都可以看到的)
           5.2.5. 将 login 文件夹上传到网站根目录(如果提示上传失败请仔细看步骤 5.2.3)
           5.2.6. 登录游戏看看效果吧

QQ截图20180306180733.png


请注意:服务器插件配置文件里的 apiurl 就是你的 VPS 或者虚拟主机的网站地址,切记结尾一定要加 /
类似于这样:

QQ截图20180306180036.png


MC 服务器登录插件配置文件中的 connectpass 必须要和网页后端的 token 设置一致,否则无法通讯(这是 API 的访问密码)。

外置登录


                               
登录/注册后可看大图


您需要自己会写启动器(拿现成源码改也是可以的!)
在启动游戏后,每 1 秒或 2 秒发送一次 HTTP 请求,http://你的服务器地址:外置登录端口/?user=用户名&pass=密码
注意这里的外置登录端口不是服务器的端口,而是 MC 服务器登录插件配置文件里的这一项:

QQ截图20180306181520.png



举个例子,你的服务器IP是 123.123.123.123,设置的外置登录端口如上 6666,玩家名字 test 玩家密码 123456,那么您可以这样请求:
易语言可以这样:
  首先,创建一个时钟控件,在游戏启动后执行:时钟1.时钟周期 = 1000
  然后双击时钟控件,弹出时钟1_周期事件,键入代码
  1. 返回内容 = 到文本(HTTP读文件 ("http://123.123.123.123:6666/?user=test&pass=123456"))
  2. 如果真(返回内容 = "200 OK")
  3.    结束()
复制代码
记得创建一个变量,名字叫 “返回内容”,类型为文本型
其他语言也差不多。

本插件所用所有代码均为原创,不存在借用/抄袭等行为

如果你喜欢这个插件,欢迎给我评分哟~
如果想要转载的话,请先通过私信告诉我哦~
本项目使用 GPL (通用公共许可证) v3 开源协议开放源代码

香蕉君の肯定

                               
登录/注册后可看大图

※ \ 完结~撒花~ / ※

评分

参与人数 6人气 +14 金粒 +124 绿宝石 +3 贡献 +1 收起 理由
ーのものー + 4 + 50 + 1 滋磁一下
2054382527 + 1 神乎其技,不服不行!
Hallon + 2 + 30 前来围观emmm
1582952890 + 4 + 44 + 3 MCBBS有你更精彩~
xmdhs + 2 MCBBS有你更精彩~
海贼王# + 1 MCBBS有你更精彩~

查看全部评分

发表于 2018-3-25 16:29:19 | 显示全部楼层
本帖最后由 andylizi 于 2018-3-25 16:32 编辑

1. ECB 在多数情况下被认为不安全的。不应该使用这种模式。详见 分组密码工作模式 - 维基百科How to choose an AES encryption mode (CBC ECB CTR OCB CFB)? - Stack Overflow

2. 在外置登录功能的服务端实现里,程序对每个新来的连接都要创建一个新线程进行处理,并且没有设置任何安全措施。这意味着攻击者可以通过不断创建空连接的方法,几乎0成本的耗尽服务端的资源。如果运气好说不定能连操作系统也一起卡死。即使防火墙有连接频率限制也没用,因为这种压测方法对频率根本没有要求,因为反正服务端不会主动断开无效的连接,大不了就是用时长一点而已。

3.
  1. private static Key generateKey(String key)throws Exception{      
  2.     SecretKeySpec keySpec = new SecretKeySpec(key.getBytes(), "AES");
  3.     return keySpec;
  4. }
复制代码

从这个生成密钥的方法来看,这完全就不是 AES-128。它究竟是什么我也不清楚,因为 SecretKeySpec (Java Platfrom SE 8) 里只提到了
This class is only useful for raw secret keys that can be represented as a byte array and have no key parameters associated with them, e.g., DES or Triple DES keys.

public SecretKeySpec(byte[] key,
                     String algorithm)
Constructs a secret key from the given byte array.

This constructor does not check if the given bytes indeed specify a secret key of the specified algorithm. For example, if the algorithm is DES, this constructor does not check if key is 8 bytes long, and also does not check for weak or semi-weak keys. In order for those checks to be performed, an algorithm-specific key specification class (in this case: DESKeySpec) should be used.
中文版是这样的
此类对能表示为一个字节数组并且没有任何与之相关联的钥参数的原始密钥有用,如,DES 或者 Triple DES 密钥。

此构造方法不检查给定的字节实际上是否指定了一个指定算法的密钥。例如,如果算法是 DES,此构造方法不检查 key 是否是 8 字节长,并且也不检查是否是全弱或者半弱密钥。为了执行这些检查,应当使用一个特定于算法的密钥规范。

因此这个类的作用只是把一个已经是密钥的 byte[] 包装为 JCE 能使用的格式,但它并不检查这个 byte[] 究竟是不是一个合法的密钥格式,即使不合法也会照章接受。
然而为什么用错误的密钥仍然能正常进行加密,这一点我也想不明白。。

先不吐槽以文本作为密钥会带来一定暴力破解/弱密码的风险,如果一定要使用文本密钥好歹也用一下 PBKDF2 嘛。。直接丢进 SecretKeySpec 里算怎么回事。。

4. 噢对了,既然这个密钥完全就是公开的(外置登录启动器需要拥有这个密钥才能登录,而玩家需要拥有启动器,因此就等同于玩家拥有这个密钥),并且全服玩家共用一个密钥,那这个加密的意义在哪里?
任何截取到数据包的人,只要想办法查查这个数据包是用来登录哪个服务器的,然后去下载一份那个服务器的启动器,从启动器里找出密钥来,就可以轻松解密全服玩家的登录数据包了。
对称加密在这种情况下完全起不到保护数据安全的作用,得使用 非对称加密 + 预先设置的公钥/证书机制(防止中间人攻击)才能解决问题。

5. 发现插件会默认使用固定的密钥 "KASUGANOSORASAES",如果服主懒得更改这个(我打赌一定有很多人忘了改),那似乎连下载启动器得到密钥这一步都可以省了。现在连路由器都知道不能默认用户名密码 admin / admin 了。

6. 如果网页端在另一台服务器上,且没部署 https,那么直接通过 http 发送密码啊什么的也是不安全的。

7. 外置登录可以参考一下国内开发者写的 authlib-injector。蛮有意思的。

目前想到的安全问题就这些。关于干啥都要 new 个 Thread 处理之类的性能问题就不说了。

点评

[s]嗯,居然引起了梨子dalao的注意,[/s]非常感谢反馈。 关于 RSA 这边,其实我是一直都有在研究的,本来打算是用 RSA 1024/2048 的,但是考虑到目前很多类似于回复中提到的性能问题,所以一直都没有做更新,因为在  详情 回复 发表于 2018-3-25 16:53
回复

使用道具 举报

发表于 2018-8-29 00:38:12 | 显示全部楼层
可以的 很棒了
回复

使用道具 举报

发表于 2018-8-28 22:42:20 | 显示全部楼层
正好缺个可以对接我启动器的登录插件,可以配合一下扫描MD5吗?,我想实现反作弊
回复

使用道具 举报

发表于 2018-8-28 16:35:49 | 显示全部楼层
很好的外置登陆插件 感谢发布
回复

使用道具 举报

发表于 2018-8-25 16:05:33 | 显示全部楼层
我服务器和网页的api都对,为什么还是现实api错误啊
回复

使用道具 举报

发表于 2018-8-25 11:44:56 | 显示全部楼层
网页显示Token Error
回复

使用道具 举报

 楼主| 发表于 2018-7-28 22:33:26 | 显示全部楼层
xiaozheng666QQ 发表于 2018-7-27 17:48
楼主,我发现一件事,你这个的外置注册怎么注册

对接数据库,直接修改数据库内容就行了,和一般网站注册程序一样
回复

使用道具 举报

发表于 2018-7-27 17:48:46 | 显示全部楼层
楼主,我发现一件事,你这个的外置注册怎么注册

点评

对接数据库,直接修改数据库内容就行了,和一般网站注册程序一样  详情 回复 发表于 2018-7-28 22:33
回复

使用道具 举报

发表于 2018-7-23 21:52:23 | 显示全部楼层
下载连接挂了,楼主补一下连接
回复

使用道具 举报

发表于 2018-3-26 17:40:33 | 显示全部楼层
感谢分享                        
回复

使用道具 举报

发表于 2018-3-25 17:37:03 | 显示全部楼层
Prismaillya 发表于 2018-3-25 16:53
嗯,居然引起了梨子dalao的注意,非常感谢反馈。

关于 RSA 这边,其实我是一直都有在研究的,本 ...

不用 RSA 的话可以考虑一下 ECDSA,它能用更小的密钥长度和更快的速度达到与 RSA 一样的安全性。
以及目前的绝大多数 HTTPS 网站使用的都是 RSA 证书,每次访问 HTTPS 网站时都要进行很多次 RSA 加解密操作才能完成握手,也没见慢到了哪里去……
回复

使用道具 举报

 楼主| 发表于 2018-3-25 16:53:31 | 显示全部楼层
andylizi 发表于 2018-3-25 16:29
1. ECB 在多数情况下被认为不安全的。不应该使用这种模式。详见 分组密码工作模式 - 维基百科 和 How to ch ...

嗯,居然引起了梨子dalao的注意,非常感谢反馈。

关于 RSA 这边,其实我是一直都有在研究的,本来打算是用 RSA 1024/2048 的,但是考虑到目前很多类似于回复中提到的性能问题,所以一直都没有做更新,因为在测试中 RSA 所消耗的性能几乎是 AES 的 5 倍左右,如果用于轮询很容易将服务器玩坏的(
authlib-injector 这个呢主要是我比较懒,不是很想研究,第二就是交流群里很多人表示并不知道如何部署这个玩意(其实主要是第一个原因
事实上 Sakura Login 属于一个实验性质的插件,如果真的要用于大型服务器,我也不敢保证运行起来没有问题(当然如果有人用我也会很高兴的

关于现状
现在我打算直接从连接层下手,而不是依靠Bukkit了,直接让反向代理服务器阻断未验证用户,抛弃掉数据包
这个反向代理就是类似于 BungeeCord 的东西吧,只不过加入了外置登录的功能。
玩家想要进入服务器,必须先连接到反向代理服务器并进行验证,验证通过后打开连接通道
这样的话,直接在Minecraft服务器前做验证,连Player对象都没有产生,几乎不会对服务器造成任何影响。
假人压测从此对MC服务器的压力变为0,因为假人压测数据包在到达服务器之前就已经被反向代理服务器抛弃了(

最后还是非常感谢dalao反馈,插件还是会持续更新的,谢谢。

顺便说一下,不要对我这条咸鱼抱有太大希望,随时跑路是很正常的

点评

不用 RSA 的话可以考虑一下 ECDSA,它能用更小的密钥长度和更快的速度达到与 RSA 一样的安全性。 以及目前的绝大多数 HTTPS 网站使用的都是 RSA 证书,每次访问 HTTPS 网站时都要进行很多次 RSA 加解密操作才能完成  详情 回复 发表于 2018-3-25 17:37
回复

使用道具 举报

发表于 2018-3-19 00:58:33 | 显示全部楼层
Prismaillya 发表于 2018-3-19 00:45
不支持~
(主要是还没去学sponge的api,感觉很不习惯

好吧……先用Flexible Login好了……你这个真的厉害了,第一次在MCBBS上看到这么6的原创插件
回复

使用道具 举报

 楼主| 发表于 2018-3-19 00:45:41 | 显示全部楼层
OMOONO 发表于 2018-3-18 22:24
请问支持sponge吗?

不支持~
(主要是还没去学sponge的api,感觉很不习惯

点评

好吧……先用Flexible Login好了……你这个真的厉害了,第一次在MCBBS上看到这么6的原创插件  详情 回复 发表于 2018-3-19 00:58
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 手机版本

GMT+8, 2018-10-19 19:17 , Processed in 0.089186 second(s), 13 queries , Memcache On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标。本站与Mojang以及微软公司没有从属关系。

© 2010-2017 我的世界中文论坛 版权所有。本站原创图文内容版权属于原创作者,未经许可不得转载。

快速回复 返回顶部 返回列表