PSC的端到端加密原理与传统SSH隧道有何不同?

8 人参与

当我们在讨论网络隧道和加密技术时,SSH隧道几乎是一个绕不开的标杆。它简单、可靠,被集成在无数运维和开发工具链中。但如果你深入某些特殊的应用场景,比如在只能通过串口(UART)或ADB shell连接的嵌入式设备上进行取证,或者在底层不支持TCP/UDP转发的受限环境中建立安全通道,传统SSH隧道可能会束手无策。这时,像PortShellCrypter(PSC)这类工具所采用的端到端加密(E2E)方案,其设计哲学和实现路径就展现出了根本性的不同。

加密的“层”与“边界”

最核心的差异在于加密发生的“层”以及它所定义的信任“边界”。SSH隧道本质上是在传输层(TCP连接)之上建立了一个加密的通道。当你使用 ssh -Lssh -D 时,加密的起点是你的SSH客户端,终点是SSH服务器。服务器解密数据后,再代表你向目标服务发起明文连接。这意味着,你必须信任SSH服务器本身,它看到了你所有的流量。

PSC的端到端加密则跳出了这个模型。它不依赖于一个预设的、具备完整网络栈的服务器。它的加密边界直接划在了你本地运行的pscl进程和远程设备上运行的pscr进程之间。这两个进程之间的连接,可以是任何形式的交互式字符流——一个串口终端输出、一个ADB shell会话,甚至是通过调制解调器拨号建立的文本界面。PSC在这种原始的、可能极不可靠的字节流之上,直接构建了一个加密的、可承载TCP/UDP数据报的虚拟网络。

协议栈的倒置

这带来了一种有趣的“协议栈倒置”。传统网络模型是“下层承载上层”:物理层承载链路层,再承载网络层、传输层,最后是应用层。SSH隧道属于应用层协议,它建立在成熟的传输层(TCP)之上。

PSC反其道而行之。它把应用层(加密隧道协议)直接“塞进”了另一个应用层(shell会话)的数据载荷里。你可以把它想象成在一个只允许传递文字的聊天窗口里,运行一个完整的虚拟网卡驱动。它对底层传输机制一无所知,也毫不在意,只要这个通道能双向传递字符(哪怕是经过Base64编码的),它就能在其上构筑一个安全的网络连接。这种设计让它获得了惊人的环境适应性。

密钥管理与会话建立的差异

在密钥管理和会话建立方式上,两者的区别同样显著。SSH通常使用非对称加密(如RSA、Ed25519)进行身份认证和会话密钥交换,依赖于预先部署的公钥基础设施(PKI)或已知主机密钥。这个过程是交互式的,涉及复杂的握手协议。

PSC采用了更轻量、更“嵌入式”友好的预共享密钥(PSK)模型。密钥在编译时(通过修改Makefile)或配置时就被静态地确定。当pscr在远程端启动,两端的程序通过识别一个特定的“STARTTLS”序列(一种内嵌在字符流中的信号)来触发加密握手,随后整个会话切换到AES_256_CTR等对称加密流。这种方式去除了复杂的协商过程,特别适合在那些没有完整密码学库或无法进行复杂网络交互的设备上快速建立安全通道。

数据封装与处理的粒度

对UDP协议的支持是另一个分水岭。SSH协议本身设计用于可靠的TCP流,其隧道功能对UDP的支持是间接且笨拙的(通常需要socat等工具辅助),并且可能在转发过程中破坏UDP数据报的边界,这对于像DNS查询这样对数据包完整性敏感的应用来说是致命的。

PSC从设计之初就将UDP视为一等公民。pscl -U参数可以直接建立UDP转发,并且其协议设计能严格保持UDP数据报的边界。这意味着通过PSC隧道发送的DNS查询包,到达远端解析器时依然是格式完好的独立数据报。这对于在受限shell环境中进行完整的网络探测和访问至关重要。

说白了,SSH隧道是你通往一个已知“安全堡垒”的加密公路,而PSC的端到端加密更像是一套通用的“安全包装纸”,无论你要邮寄的渠道是水管、通风道还是信鸽,它都能把你要传递的“网络包裹”原封不动地加密、打包,并在另一端完好拆封。前者强大而标准,后者则充满了黑客式的灵活与狡黠,专门解决那些标准方案覆盖不到的边缘问题。

参与讨论

8 条评论
  • 灵光遁

    这解释挺透彻的,之前一直以为SSH是万能的,没想到还有这种场景限制👍

    回复
  • 憨憨的拖鞋

    要是串口连个加密隧道都跑不了,PSC这设计确实有点东西

    回复
  • 嗜血狂徒

    所以PSC的加密是在shell会话里跑的?相当于把网络包塞进文本流里传?🤔

    回复
  • 瑜伽小能手

    前几天用ADB搞设备取证,卡在没网络转发,早知道试试PSC了

    回复
  • 黑暗福音

    M1芯片上能用这玩意吗?还是说对架构有依赖?

    回复
  • 柠檬清香

    我试过用socat转UDP,确实容易丢包,PSC能保数据报边界算是解决了痛点

    回复
  • 迷雾贤者

    预共享密钥编译进去,那密钥轮换咋办,不是得重新刷?

    回复
  • 枯骨将军

    这个比SSH灵活太多了,尤其是对老设备支持这块

    回复