一位网络作家向我倾诉
自己熬夜码字写的小说
每次刚更新一章就被盗版网站秒传
作者收入锐减
读者体验差
平台口碑崩塌
今天我们就来拆解
小说网站如何用技术手段守住版权
拒绝白嫖

盗版网站最常用手段是爬虫抓取内容
所以防盗版的核心是
让内容不可直接读取
且只有合法请求才能解密

看一个最简单的对称加密AES的例子
在服务器端对小说内容加密
网页、App端用密钥解密
密钥绝不硬编码
而是通过安全通道下发
如用户登录时生成
public class ContentEncryptor {
private static final String SECRET_KEY = "我的密钥";
private static final String ALGORITHM = "AES";
// 服务端加密
public static String encryptContent(String content) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(SECRET_KEY.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
return Base64.getEncoder().encodeToString(cipher.doFinal(content.getBytes()));
}
// APP/浏览器 客户端解密
public static String decryptContent(String encryptedContent) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(SECRET_KEY.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decoded = Base64.getDecoder().decode(encryptedContent);
return new String(cipher.doFinal(decoded));
}
}
这样爬虫抓到的只有加密字符串
如 aKJHlHKJpouihKJjnbdrtyiu=
无法直接解析成文字
除非获取到动态密钥
由于爬虫的机械性
盗版网站常伪造请求
如直接调用API
我们可以通过请求签名
确保每次请求来自合法客户端
public class RequestSigner {
private static final String ALGORITHM = "HmacSHA256";
private static final String SECRET_KEY = "我的密钥";
// 生成签名
public static String generateSignature(String requestParams) throws Exception {
SecretKeySpec keySpec = new SecretKeySpec(SECRET_KEY.getBytes(), ALGORITHM);
Mac mac = Mac.getInstance(ALGORITHM);
mac.init(keySpec);
byte[] signedBytes = mac.doFinal(requestParams.getBytes());
return Base64.getEncoder().encodeToString(signedBytes);
}
// 服务端验证签名
public static boolean verifySignature(String requestParams, String receivedSignature) {
try {
String expected = generateSignature(requestParams);
return expected.equals(receivedSignature);
} catch (Exception e) {
returnfalse;
}
}
}
当API请求小说内容时
必须携带timestamp和signature
服务端用相同规则生成签名
与客户端传来的对比
若签名不匹配
直接返回403表示无权访问
有个小说网站很先进
直接阅读文字都是正确的
但复制下来就都是错字
比如 “大白” 会变成 “小黑”
“张三” 会变成 “李四”
让盗版阅读者感觉狗屁不通

这是通过服务器返回内容时
对文字进行字符映射替换
例如凯撒密码
让文本变成错字
而正版的浏览器通过前端JS动态解密
显示正确文字
爬虫抓取HTML源码时
只能看到混淆后的错字
无法识别原文
public class ContentObfuscator {
// 将文字转为错字,凯撒密码偏移1,实际上比这个复杂
public static String obfuscate(String text) {
StringBuilder sb = new StringBuilder();
for (char c : text.toCharArray()) {
if (Character.isLetter(c)) {
char base = Character.isUpperCase(c) ? 'A' : 'a';
c = (char) ((c - base + 1) % 26 + base); // 例:a→b, b→c
}
sb.append(c);
}
return sb.toString();
}
}
服务器存储或返回内容时
先调用 转换 “你好”
返回 “jpbo”
前端反向还原
function deobfuscate(obfuscated) {
return obfuscated.replace(/[a-z]/g, c =>
String.fromCharCode((c.charCodeAt(0) - 97 + 25) % 26 + 97)
);
}
以上是防盗版的三种常见做法
实际可以增加一些自己的算法策略
多种方式相结合
包括论文、知识产权等
都可以套用这些方式
防盗版不是技术竞赛
而是对创作者的尊重