准备升级一个开源的 php 加密扩展 跪求破解高手打脸

2016-06-21 10:50:53 +08:00
 rekulas

基于据说日本人写的 php screw
然后进行了些修改,为了区分暂时命名为 screw plus 然后做了以下改进
增加了批量加密
升级了加密算法,更加安全可靠
加密函数是用的网上找的基于 php 的 authcode 算法,然后稍微进行了些小优化
加密的优点:
可防止源码泄露,别以为 vps 就绝对安全了,我有个朋友的 vps 就被工作人员直接破解了,原因是另一个客户记错了 ip ,没核对信息就。。。
商业源码可加密核心功能,只开放接口给客户
部分公司需要团队开发的,可防止源码泄露
其他。。。我编不出来了
下面是演示对比:
PHP 原生代码:

screw 加密:

screw plus 加密:

之所以要用扩展来加密是因为这是最安全的方法,不需要扩展的加密都是可以破解的,唯一不同的就是破解时间的区别(当然,扩展加密也是可以破解的,但是破解时间不是破解者所能承受的毕竟没人能活几万年)

有兴趣的朋友可以关注下,完全完成后我会上传到 github 和 oschina

有破解能力的可以尝试下破解以下 code 来打我脸,加密函数在这里 http://filedoc.s3.sinaapp.com/myfiles/cauthcode.c

code:

f83c0c86454591265c9f772eb499ea4a3+Mrn7H3huTwgitNLGtAZlrixw5BLaHDeoYUJR8xg3NgVz8wlTWYV0x9dgW7q6eRVexLVBWOipqQgK74mdMNe/fyx42uf607MUfpPLNiBNCtHbB8rnrnpxKqVXJVUu/83GVFfwOTrt4Bge3erdYUp38DyHgLXlKGevf4MW7SB1hwd9P1rsyDQHzvzxltBU9+fanOC5Vp+uuz4BhXJsnhJTlM8pRjEwfnH9D+KkxryKNnC0YwmCrGYWDODanCzyDOOjadr5GovnGyzPmhZjlSy6zSWX0OVjESSO+evaN4tB5V5WWqC0cjZTTfHIjFt5i5Gut8qpOM8oWKzCUd5B8NOwFoNsotlM6feRHQajRDOQiXURco1yvHeUGWT07mg9h+65jJxVxF0gx8OFQrxxFxMBXEUdzb9T6V6jwA8jcyjn2U8HESLo+t4YC8P//afy6yXicSeW1LGeLyng7RITLnFSPPxRHeuAMSBqvXhxXSbIv+HCLst/edoWUtBq09Ig0UXuLo1MWce/DuqDg2QHe9NQM4AVUE9VD2p0DTcmgrCDXRjufiSqzh2pPnWkw6yNUqp6SNSAGVSzrMm8OvoLKt6bwTB22FNAsI5ANlVvgRnth+sSeZ1FdTKOt0vQckMBgxLi2emm8V6PD6NQhlJisX0K21uySiQIZRMlNhAHGMgM6s7dYgGwQUNWfmrgTfNvLaA2BL7cRbLmb9BK2n+VI/fP4xY4NbvhtykImOVXTY9g8gyZqykbTo7WHwXleRl7qj6rIh7WZKmrn+IURZbm0lFd8g4YKs5kOcEDAlZequv2sAGMECLLx5qPSTnuUVTrDBGIWG5Uy4IsOnkeRBKMNN4L1UlT3jPygqc5Dd9axGcnvOM5FGZU/Xj7CBFtNwTkcBeUd40t2FiQ0ZgDy+rP7eRV5fCSosd2ol2bpzbbYQjjAASqz7duknPM+y8daSRIuvS83eJUe/5gIYDaJqNPgS1cl6L6feij1xiV4syZ4UD5byaZreMHKGTtdh5iGHjTakdje5Tt5OxoRr/JK74QqVaXDibUFQuZKAsGkrR3S3JgL//cPkvymSlVed355BZHPPMZ0x+0o3MFWkJZL5mSgHxmO6WzW34wMGIY8N/yhSgJflGElSgm61O1E8yYrOBD2UWmXr55WvcnivkemY4pLzAnQRn6tug89yseEELG46w87TIfes9zTtmr1/mogZzbGcjEU3j+kR8pLMSE03LtVp2QSxEHxepc6ngSxXiWugMyfWaOlTK+1X1AyN4IGvZBdkM7HEQx2iHGJ+yT2lEqrwiD0/yuD6T7pWOhTmx6W/UAdopciiUPraoeEJcAw7eSMOn1xZbq7SBgzzSAWcFXYoZZeejsSHZGSXWM+IXKzjJ6pTiuErPykMUvu698z7Cpb235f2vI0tIRE0UOKrnaGGgGVIJCORlpoccLKuzkNuU3HmNEKCfTL1QgsxWMNGgZlWKZsQWbYJNOj0xFUu12CUcwnpjB2faRh3CKXNZtOweKnLTfF/wgLHA7tNs4mZydLxad4dwkvfXl69bn3K+D7NRT22BYbnACbGODFQTZ+dWi033YbXr/bPAwULVnWh56DC/Q2NFKzQYND+gML/8IqSNq4g+rCGzziNtysV0IIpNdptoLcH9GB/fEQkpfHPS1Bh/wTG
14533 次点击
所在节点    程序员
56 条回复
q397064399
2016-06-21 20:56:14 +08:00
@rekulas 只是防 WEB 入侵,够用了, web 黑客一般很难提权到 root 权限的
q397064399
2016-06-21 20:59:15 +08:00
@rekulas 另外重新写下 php 词法解析器的代码 然后把词法分析那段代码进行加密, VPS 宿主机应该也很难 dump 源码了, 我最近在读词法分析之类的书,这个难度应该不是很大,
rekulas
2016-06-21 21:01:27 +08:00
@q397064399 可能吧 不过我觉得能防 web 破解已经足够了,毕竟应该没有人用 php 来写需要达到这种安全保密级别的吧
allenhu
2016-06-22 08:55:34 +08:00
玩具
realpg
2016-06-22 09:17:26 +08:00
@rekulas
用了这个以后 opcache 还有用么?还是你内置了一个 opcache 优化实现?
SunnyMeow
2016-06-22 10:58:56 +08:00
如果我没理解错的话楼主的算法其实就是 RC4 吧,有统计学弱点,但光凭一条密文做唯密文攻击是很困难的
不过这不代表不能玩已知明文攻击啊,楼主愿意的话再用相同的密钥加密一串等长随机字符串,把明文和密文都发上来就可以玩了。
rekulas
2016-06-22 13:12:55 +08:00
@realpg 对 opcache 不太了解,有空我测试下看看有无影响,不过个人感觉应该不会冲突的
@SunnyMeow
你大概需要多少条,我可以批量给你生成
rekulas
2016-06-22 13:15:16 +08:00
@SunnyMeow 这算法也比较流行,对已知明文攻击的防御强度肯定是大于 RC4 的,但具体有多高我也不确定,所以打算下一步升级到 AES 加密
SlipStupig
2016-06-22 13:55:59 +08:00
你这个不是在验证你扩展的安全性,而是加密算法的安全性,如果扩展一旦泄露本地搭建一个环境就可以解密出来了,如果服务器是安全的,也没办法偷你的代码啊.....
rekulas
2016-06-22 14:12:51 +08:00
@SlipStupig 服务器安全不代表 web 安全,其实 web 泄露的情况还是比较严重的,扩展泄露你也得拿到 key 才行,而由于是开源的,你可以用更复杂的方法来隐藏你的 key
SunnyMeow
2016-06-22 14:48:15 +08:00
@rekulas 我看下来就是完完全全的 RC4 啊,都没什么改变。
理论上做已知明文攻击只要一条明文密文对就行了,要求是加密用的密钥和你给出的挑战用密文使用的密钥是一样的,明文的长度不小于挑战用明文,其他没什么了,我想试试看。
rekulas
2016-06-22 15:00:05 +08:00
@SunnyMeow
给几个简单的吧,你说明文的长度不小于挑战用明文什么意思
abc 3HiOEZkAmaIEFsKEwoLDlxPDsXc6S8OpwozCrcOnwro8w4p6wp4AOn3CgFDCtTLDsBBqaQ=
123 UjKOk16aHf57GHlzIsK6XcOuZE9iw5daKE7Cn8OZw7zCq8OiJ8KUVnPDlzVCw758w4M
111 qdYoNQN5zVmocUPDk8Ohwq5jdQ4+w7HChV7DgC/Dk3QFQwUjUQQMAQ3CgsOUAcKy
rekulas
2016-06-22 15:04:42 +08:00
@SunnyMeow 上面加密用的是 js 版本的,不过算法都是一样的,但 js 版本可能更难分析一些,如果需要 c 版本的我可以重新生成
SunnyMeow
2016-06-22 15:07:05 +08:00
@rekulas
你在帖子正文中附了一串挑战用的 code ,是一串经过你的算法加密后的密文,这条密文对应的明文长度比如说是 100 ,我现在需要的就是长度大于 100 的使用同样密钥加密的明文密文对
rekulas
2016-06-22 15:13:58 +08:00
@SunnyMeow http://filedoc.s3.sinaapp.com/myfiles/FILE.zip 0 是源代码 1 是加密后的 密钥都是同一个,加解密算法在项目里面 http://git.oschina.net/splot/php-screw-plus
SunnyMeow
2016-06-22 15:30:33 +08:00
@rekulas 你提供的压缩包里一共有 8 个文件,其中`install_var.php`, `install_extvar.php`, `install_mysqli.php`这三个文件的加密密钥和其他五个文件不同,同时这两个加密密钥和你在主贴里提供的以`f83c0c86454591265c9f772eb499ea4a3+Mrn7H3huTwgitNLGtAZlrixw5B`开头的密文使用的密钥也是不一样的
rekulas
2016-06-22 15:37:46 +08:00
@SunnyMeow 压缩包里用的密钥都是同一个
SunnyMeow
2016-06-22 15:38:44 +08:00
@rekulas 好吧是我理解错了,撤回上一条回复
SunnyMeow
2016-06-22 18:00:03 +08:00
@rekulas
我又仔细读了一下算法,发现自己漏看了 keyC 是随时间变化这个关键点,所以选择明文攻击只能有限度的进行
吐槽一下那段 c 代码,看起来很头大,很多循环和变量完全都可以合并在一起,很多地方看起来很危险很容易越界的样子

下面是我看出来的一些弱点:
1. 使用了基于时间的 IV
这是最大的弱点,其使得选择明文攻击得以成为可能。仔细观察一下,你可以注意到挂出来的那个文件夹里 5+3 个文件都共享了相同的 IV ,如果计算速度足够快,就有可能整个项目共享一个 IV ,相同 IV 的文件中只要一个文件的明文已知就可以推出其他文件中至少一部分的明文内容了。原理是 ciphertext xor plaintext = key ,不详述了。

2. 加密方法暴露了密钥长度
算法没有规定最小密钥长度,这本来不算大问题,但是对 keyC 画蛇添足进行截断就会暴露原始密钥的长度。试想使用者如果设定了一个较短长度(比如 32bit )的密钥,攻击者就可以在十几分钟内通过穷举攻击破解出来。

3. 密钥空间不够大
算法一开始就把输入的 key 做了 md5 ,然后平分拆成 keyA 和 keyB , md5 输出一共才 128bit ,拆一半只有 64bit 了,由于 keyC 随密文提供,完全秘密的只有这 64bit 的 keyA ,虽然穷举 2^64 也是非常困难,但我觉得在现代密码中这也能算得上是一个设计弱点了。

4. MAC 设计有问题
我读了算法发现前面被分出来的 keyB 只在预处理明文的时候被用到过,结合上下文我大胆的猜想你是想要实现 MAC 机制。然而 MAC 机制本不需要用到密钥来实现,这里分出 keyB 既没有好处,也影响到了密钥空间的大小。

5. 过期机制的实现有问题
源码里有提到 expire 的概念,相信你是想提供过期机制吧,但这个过期只能在逻辑上做判断,并没有提供数学上的保证,如果攻击者在过期后获取到密钥,仍然可以构造出 keyA 并对文件进行解密。

综上所述,这个算法的核心就是一个内部基于 RC4 ,并且提供了初始向量支持的代码加密算法。先不说对解释执行的代码进行加密是否有意义,即使作为纯文本加密,也是有很多弱点的,而这些弱点并非理论本身的缺陷,都是在你设计加密算法时不慎引入的,我没有接受过系统的信息安全训练都能看出那么多问题,所以不建议自己设计加密算法的原因就在这里。
rekulas
2016-06-22 19:26:25 +08:00
首先说明下这个算法不是我写的,原来是 php 里的后来被人翻译到 c 我之前还翻译过一个 js 版本的 http://git.oschina.net/splot/dopass/blob/master/crypt.js
密钥问题其实早就注意到了,不过之前忘了修改这里,下午我重新提交了个版本 http://git.oschina.net/splot/php-screw-plus/blob/master/cauthcode.c 增加了个 hiddenKey 来预防这个,不过实际使用中如果用户没有更改自己的 hiddenKey 仍然存在风险,过期机制是原 PHP 算法里的,其实是没有意义的只是还未删去,算法确实还存在攻击风险,不过不会再更新,因为下个版本打算使用 aes 加密并且初始化时动态生成 hiddenKey ,这样至少在算法上是可以保证安全了。
另外能不能加好友下, c 新手想请教些问题 我的 q 在三楼

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/287240

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX