shoaly
shoaly
一直感觉 frp 客户端和 服务端的连接的机制上, "太过于信任" frpc.ini的配置
可能是我没表述清楚, 重新表述一次呢, 所有的frpc.ini都是 服务端下发的, 但是 frpc.ini现在是明文的所有有篡改的风险. 我把服务器端下发的配置: [rdp100030] type = tcp local_ip = 127.0.0.1 local_port = 3389 remote_port = 13322 抽象成这个字符串: "rdp100030:local_ip=127.0.0.1&local_port=3389&remote_port=13322&type=tcp" , 如何保证他不被修改呢, 就是服务器端下发这个字符串之前 多加一个参数, 做md5签名, 追加到下发的配置当中: md5("rdp100030:local_ip=127.0.0.1&local_port=3389&remote_port=13322&type=tcp&key=123456") 也就是等于:...
这个实现方案是支付接口使用非常频繁的手段, 支付接口里面的金额, 或者敏感信息也是需要做签名去防止修改的, 所以很自然就想到 可以用一样的思路来签名 frpc.ini 参照微信支付签名的方式, 支付那边用的很频繁了, 只是还多做了一个按照键名排序, 这样可以保证字符串拼接的顺序 https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3
> 签名太麻烦了,建议做成服务端可以配置多个token,或者加个客户端id,针对每个客户端设置可用的端口与协议 看我上面的描述, 客户端配置 和服务端配置 都只添加一行即可, 签名机制并不会让正常使用变得麻烦
@recolic 这里的初衷是客户端和服务端 并不是同一人, 服务端可以将frp的服务提供给多个客户端, 但是要防止客户端擅自改动配置, 并不是因为开源项目, 客户端就可以随便修改配置了啊
@ysc3839 安全性上, 其实md5已经足够了, 因为要碰撞出一个修改的客户端配置, 还能通过服务端md5校验的, 不可能的事情. 并不是md5过时了就完全不能用在任何地方了
> @lenghun 签名参数是已知的,所以可以去掉,不影响之前的文件内容 MD5 值的计算,你可能没有理解我的意思。只记录文件 MD5 ,不签名,则文件内容无法保证不被修改。这里的需求是,服务端给出的配置,要求不能被变更,而不是让客户端随意指定配置,不是一个场景。 > > @ysc3839 MD5 或者其他都可以,综合考虑。 只是这个地方用配置文件的md5+服务端密钥一起做md5 确实有一点点不够稳妥, 主要是那个客户端配置文件太严格了, 不知道会不会因为 客户端无意多了一个空格, 或者windows linux 那种文本BOM切换之后 md5会不会改变, 之前提意用 键值对来拼接的话, 对客户端配置文件的内容要求要更松一些
> @shoaly 主要是考虑易用性方面,如果每一个代理一个 sign ,是不是比较繁琐。还有如何简单的进行签名,这方面有什么建议? 还是每一个 客户端配置 一个签名呀, 但是签名的时候 就麻烦循环一下 客户端配置里面所有的键值对, 然后键按照a-z排序, 首尾拼接成一个大的字符串, 然后做md5就可以了, 这样客户端配置, 多几个空格, 也不影响键值对, 甚至 客户端那边键值对配置 更换顺序也不影响签名的