使用 PrivateBin 对抗取证与监视:从“零知识粘贴板”到自建隐私分享系统

PrivateBin 是零知识加密 pastebin:内容在浏览器端 AES-256-GCM 加密,服务器只存密文。本文讲清服务商能看到什么、如何正确使用与自建加固。

PrivateBin

为什么是 PrivateBin:它解决的是“内容可见性”,不是“全能隐身”

在现实世界里,“取证”和“监视”往往不是电影式的黑客入侵,而是更朴素、更常见的路径:

  • 聊天软件/邮件/云文档里长期留存的明文
  • 企业网关、DLP、杀软、聊天“链接预览/安全扫描”带来的自动化抓取
  • 服务器访问日志、反向代理日志、CDN/WAF 日志里记录的IP、时间、UA等元数据;
  • 终端侧(你的电脑/手机)浏览器历史、剪贴板、截图、同步备份带来的本地痕迹

PrivateBin 的核心价值,是把“内容”变成端到端加密(浏览器端加密/解密):服务器只存密文,因此服务商天然更难“内容取证”。但它并不承诺让你在网络里隐身,也不承诺对抗恶意服务商投毒脚本这类“供应链式攻击”。官方也明确指出:用户仍需要信任服务端不要下发被篡改的脚本,必须使用 HTTPS,并且要理解访问日志仍可能暴露“谁在什么时候访问过”。

项目网址

  • PrivateBin 官方站点:https://privatebin.info/
  • GitHub 仓库:https://github.com/PrivateBin/PrivateBin
  • 官方演示实例(Try it out):https://privatebin.net/

下面我们用“隐私优先”的方式,把它讲透并教你落地。


PrivateBin 是什么:零知识(Zero-Knowledge)Pastebin 的工作方式

PrivateBin 是一个极简、开源、自托管的 pastebin 系统,官方描述它为“服务器对存储数据零知识(zero knowledge)”。其关键机制是:数据在浏览器中加密/解密,并使用 256bit AES-GCM

它的“零知识”靠什么实现?

你可以把一次 PrivateBin 分享理解为两段式:

1) 服务器端拿到的只是密文:你提交的 paste 内容在本地(浏览器)被加密后上传,服务器存储的只是加密后的结果。
2) 解密钥匙不交给服务器:PrivateBin 生成的“解密 key”放在链接的 # 之后(URL fragment 部分)。Fragment 不会随 HTTP 请求发送到服务器,它只在客户端侧被浏览器处理;PrivateBin 官方 FAQ 也明确说明:解密 key 位于 URL 的 hash 之后,不存储也不传输

换句话说:服务商即使拿到了数据库/文件系统里的所有 paste,也主要是拿到“上锁的盒子”;钥匙在你分享给对方的链接里(而且是链接 # 后面的部分)。

重要提醒:这也意味着“拿到完整链接的人=拿到钥匙的人”。官方强调:不设置密码时,任何拿到链接的人都能解密内容;需要“更私密”,就要再加一层“密码”。


加密与协议细节(技术向但很关键)

根据官方 Wiki(Encryption format)的说明,PrivateBin 在客户端侧大致做这些事:

  • 生成一段随机的 paste_key(示例写的是 32 字节随机数),并把它编码后放进 URL fragment(# 后面)。
  • 若你设置了“额外密码”,密码会参与派生最终加密用密钥(你可以把它理解成“链接里的随机 key + 你输入的密码”共同决定最终能否解密)。
  • 使用 PBKDF2(HMAC-SHA256)等方式进行密钥派生,并使用 AES-GCM 进行加密;同时可以启用压缩(例如 zlib)后再加密以减少体积。

你得到两道门:

  • 门 1:完整链接(含 # 后的 fragment key)
  • 门 2:你额外设置的密码(可选,但强烈建议在“对抗转发/日志泄漏”场景使用)

“一次性阅读(Burn after reading)”如何对抗链接扫描?

很多企业/邮箱/聊天系统会对外链做“安全扫描”和“内容预览”。如果你设置了“阅后即焚”,扫描器可能在你朋友打开之前就先访问一次,导致 paste 被销毁。

官方加密格式文档提到一种 URL 变体:在 fragment 里加入 #- 前缀,让打开链接时先需要用户确认才加载 paste,用来降低 URL 扫描器“自动执行 JS 并触发销毁”的概率(官方明确说这第二种 URL 主要是为 burn-after-reading 准备的)。

这点在“对抗监视/取证”的实操里非常有价值:你对抗的不是数学上的 AES,而是现实里的“自动化系统”。


提供商(服务商)能看到什么 / 看不到什么(最重要的一节)

一图看懂:服务商可见 vs 不可见

类别服务商能看到(或推断)服务商看不到(除非你泄露链接/终端被入侵)
内容本体密文(ciphertext)、未加密的盐值/部分元数据字段明文内容(paste 文本、附件内容、评论内容等在浏览器端加密)
解密钥匙——URL # 后的解密 key:官方说明它不存储也不传输,位于 hash 后
你设置的密码——密码不存储也不传输(官方 FAQ 明确写出)
元数据(粘贴属性)例如:创建时间戳、过期秒数、格式类型(纯文本/代码/Markdown)、是否开启讨论等(部分元数据不加密)——
访问层面日志访问 IP、访问时间、User-Agent、可能的 Referer(取决于你的环境与服务端配置)——(这些本来就发生在传输层/HTTP 层)
评论头像/图标若启用基于 IP 的头像/标识,可能带来 IP 被猜测/关联的隐私风险(可配置禁用)——

进一步拆解:哪些字段是“端到端加密”的?

官方 FAQ 给出了清单:以下内容在浏览器端端到端加密(上传前加密、下载后解密):

  • paste 文本
  • 文件与文件名
  • 讨论区评论
  • 讨论用用户名(昵称)

同时,FAQ 也明确指出:有些元数据不加密,比如时间戳、过期时间、格式、是否开启讨论、以及某些基于 IP 的用户图标等。

这就是为什么“PrivateBin 让服务商看不到内容”,但不能让服务商“看不到你和谁在什么时候互动过”。


使用 PrivateBin 的正确姿势

一个 PrivateBin 实例。
一个 PrivateBin 实例。

第 1 步:选实例——能自建就自建,不能自建就做最小信任选择

官方 FAQ 的建议非常直接:推荐自建;否则就找你信任的运营者。

如果你必须用别人的实例:

  • 确认地址栏是 https://
  • 可用 SSL Labs、securityheaders、MDN Observatory 等做基础检查(官方给了清单);
  • 也可以使用官方的实例目录(instance directory)辅助选择。

第 2 步:新建 paste 时,优先做这 4 个隐私决策

1) 设置过期时间:越短越好(减少“未来被翻旧账”的取证窗口)。
2) 需要时启用阅后即焚(burn after reading):一次访问就销毁,适合一次性口令。
3) 强烈建议设置“额外密码”:因为“完整链接就是钥匙”,而链接可能被转发、被截屏、被日志记录;加密密码是第二道门。
4) 慎用讨论功能:讨论会引入更多交互与元数据;如果一定要用,考虑隐藏评论时间显示(配置项允许不展示时间以增加隐私,但内部仍会记录用于排序)。

第 3 步:复制并保存“删除链接”(很多人忽略)

PrivateBin 在创建 paste 后通常会给你一个删除链接/删除 token(用于提前删除)。官方 FAQ 说明:没有删除 token 就只能等过期或等清理周期。

隐私建议:把删除链接保存到你的密码管理器/安全笔记中,避免“发错了却删不掉”。

第 4 步:分享链接要“分流”——链接和密码不要走同一条通道

因为:

  • 链接里包含 fragment key(“钥匙”),拿到链接的人理论上就能解密(没设密码时尤其如此)。
  • URL 缩短服务会记录访问日志,官方明确不推荐;并且配置文档也提醒:URL shortener 会泄露加密 key,建议只用自建短链。

一个实用的“反取证/反监视”习惯是:

  • 链接走 A 通道(例如邮件);
  • 密码走 B 通道(例如端到端加密聊天、电话口述、当面)。

第 5 步:接收方打开时,尽量避免留下本地痕迹(“端点取证”才是大头)

PrivateBin 解决的是“服务器看不见内容”,但本地仍可能留下:浏览器历史、缓存、剪贴板、截图、同步备份。

实操建议:

  • 用无痕窗口/临时浏览器 profile;
  • 不要让浏览器/输入法云同步剪贴板;
  • 在“高风险场景”用隔离环境(例如专用浏览器、临时虚拟机);
  • 别把完整链接(含 #)粘进会被记录的地方(工单系统、群公告、笔记软件)。

自建 PrivateBin(把信任面缩到最小)

如果你的目的是“对抗警察取证和监视”,自建几乎永远是加分项:你把“可被强制调取日志/可下发恶意脚本”的第三方,缩减成你自己(或你信任的组织)。

第 1 步:确认运行环境与最低要求

官方安装文档写明最低要求:

  • PHP 7.4+
  • zlib 扩展
  • 浏览器启用 JavaScript

(可选)如果你使用特定头像库可能需要 GD 扩展;jdenticon 不需要 GD。

第 2 步:下载与部署(官方 TL;DR 路线)

官方给的“TL;DR”是:下载最新 release archive,解压到 Web 目录。

我们建议你阅读安全小节与配置选项,别把默认配置当“万能安全”。

第 3 步:把敏感目录移出 Web 根目录(强烈建议)

安装文档提供了一个非常重要的加固思路:你可以在 index.php 中定义不同的 PATH,把 cfg/data/tpl/vendor/ 等目录移出 document root,只让 Web 可访问静态入口,从而降低被误配置暴露的风险。

这一步对“对抗取证”也有意义:即使 Web 服务层面出现路径穿越/静态目录暴露一类问题,你也尽量不把数据直接放在可被下载的位置。

第 4 步:配置文件与功能开关(把“隐私默认值”调到位)

官方配置文档说明:复制 cfg/conf.sample.phpcfg/conf.php 并修改。

建议的“隐私优先”取向(按需取舍):

  • password = true:允许用户为 paste 设置额外密码(建议启用)。
  • fileupload:默认 false;除非你确实需要传文件,否则建议保持关闭,缩小攻击面与误上传风险。
  • discussiondatedisplay:如果你开讨论,可考虑不显示评论时间(减少旁观者通过截图/转发做时间线分析),但注意内部仍会记录用于排序。
  • icon = “none”:评论头像可能与 IP 推断相关,配置页面明确说这是潜在漏洞点,并引用了安全审计(ZeroBin audit 的相关问题);对“隐私极致”场景建议禁用。
  • cspheader:保持严格 CSP,减少第三方资源加载与被动追踪面;FAQ 也解释了默认 CSP 会阻止第三方图片,以防用“追踪像素”跟踪访问者。
  • urlshortener:除非你自建短链,否则不要启用;配置文档明确说这会泄露 paste 的加密 key。

第 5 步:必须上 HTTPS(否则“对抗监视”从根上失败)

安装文档写得很直白:没有 HTTPS PrivateBin 不安全,因为 JS/WebAssembly 文件可能在传输中被篡改。

此外,官方首页也强调:用户需要信任服务端不会注入恶意代码;并建议使用 HTTPS、HSTS 等。

这背后的逻辑是:PrivateBin 的加密发生在浏览器端,如果你拿到的是被动过手脚的脚本,“端到端加密”可能会被绕开(例如脚本在解密后把明文偷偷发走)。这也是官方反复提示的边界。

第 6 步:阻止搜索引擎与机器人“捡到钥匙”

安装文档提到:根目录提供 robots.txt,请求搜索引擎不要索引/爬取,从而避免 paste key 泄露;如果你把 PrivateBin 装在子目录,建议把 robots.txt 放到站点根并调整路径。

文档还提到 .htaccess.disabled:可用于阻挡一些已知机器人/链接扫描 bot(Apache 下可改名启用;其他 Web 服务器需手动配置)。


真正“对抗取证与监视”的关键:你要防的是这些“现实攻击面”

1) 访问日志依然能出卖你:IP/时间/频率

官方首页提醒:管理员可能被迫交出访问日志;PrivateBin 加密了内容,但“谁访问过(尤其首次访问)”仍可能通过日志暴露。

因此,如果你对“监视”敏感:

  • 选择你信任的运营者或自建;
  • 尽量减少日志留存(反向代理/应用/系统日志策略);
  • 高风险场景使用 Tor/VPN 等降低 IP 关联(这属于通用网络匿名性范畴,PrivateBin 本身不替你解决)。

2) URL 本身就是“证据”:浏览器历史、聊天记录、工单系统都可能保存它

因为解密 key 在 URL # 后面,完整 URL 一旦被记录,就等于钥匙被记录。FAQ 明确说“key 是 URL 的一部分”;并强调不要在公开场合发布链接。

落地建议:

  • 避免把链接粘贴到会被长期保存/可审计的系统;
  • 不要用第三方短链;官方明确警告短链服务可能从访问日志取到你的完整 URL(含 key)。

3) 讨论区的“头像/标识”可能引入 IP 推断/关联风险

配置文档明确说明:PrivateBin 的评论头像基于评论者 IP 生成,这是潜在隐私问题;为最大安全可禁用。
被引用的安全审计中也提到:基于 IP 派生的 vizhash 头像存在“在线猜测”风险(尽管评估为较低影响,但在高敏感场景仍应减少不必要的可关联信号)。


常见误区:PrivateBin 不能替你解决的 5 件事

1) 它不能防“恶意服务商/被入侵服务商”下发恶意脚本:官方明确承认 JavaScript 加密的概念性问题:你仍需信任服务端不投毒脚本;要更强就自建并用 HTTPS,或使用第三方客户端。
2) 它不能抹除访问日志元数据:IP/时间等依旧可能存在。
3) 它不能保护你的终端:浏览器扩展、木马、系统级取证、剪贴板记录、截图等都能绕过“服务器零知识”。(这是端到端加密工具普遍边界)
4) “不设密码”并不私密:拿到链接的人就能解密,官方在 FAQ 里写得很直白。
5) HTTP(无 TLS)= 直接破功:官方安装文档强调没有 HTTPS 不安全,因为脚本可能被篡改。


实操:一次“隐私优先”的 PrivateBin 分享(10 步流程)

PrivateBin 操作演示图
PrivateBin 操作演示

1) 尽量使用自建实例;做不到则选可信运营者并确认 https://
2) 打开新建 paste 页面。
3) 粘贴敏感内容(例如一次性口令、服务器日志片段、配置片段)。
4) 设置较短过期时间(例如 10 分钟/1 小时),避免长期暴露。
5) 勾选 burn after reading(如果是一次性秘密)。
6) 设置一段足够强的“额外密码”。
7) 创建 paste,复制“访问链接”和“删除链接/token”。
8) 链接发给对方,但密码走另一个通道(端到端加密聊天/电话/当面)。
9) 如果你担心“链接扫描器提前访问”,考虑使用官方文档提到的“需要确认才加载”的 URL 变体思路(尤其搭配阅后即焚)。
10) 对方读完后,你用删除链接手动删除(或等待阅后即焚/过期自动清理)。


附录:隐私加固清单

使用者清单(你在用别人实例时)

  • 只用 HTTPS(不然别发敏感内容)
  • 永远设置过期时间(越短越好)
  • 高敏感内容:开启阅后即焚 + 额外密码
  • 不用第三方短链(会泄露 key)
  • 不在公共平台贴完整链接(完整链接≈钥匙)

站长清单(你在自建时)

  • PHP 7.4+、zlib 扩展到位
  • 配置 HTTPS(并考虑 HSTS/安全头)
  • cfg/data/ 等移出 Web 根目录(PATH 技巧)
  • 设好文件权限:避免其他系统用户读取 conf 与 data
  • 严格 CSP,默认阻止第三方图片追踪
  • 视需求禁用 IP 派生头像/标识(icon=none)
  • robots.txt 与机器人拦截策略,避免搜索引擎/扫描器“捡到钥匙”

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注