Shannon 熵以 1948 年创立信息论的 Claude Shannon 命名,是对数据中不确定性或随机程度的数学度量。在信息论语境下,熵衡量数据源产生信息的平均速率。熵越高表示越难预测、信息量越大;熵越低表示越有规律、越可预测。
可以把熵理解为数据带来的「意外程度」。若整条消息全是字母 A,几乎没有意外——下一个字符完全可以预料,熵为零。若数据接近真随机、每个字节以近似均匀概率出现,则接近最大熵——几乎无法预测下一字节。
Shannon 熵按下式计算:
其中:
H(X) = 数据的熵
P(xi) = 符号 xi 出现的概率
Σ = 对所有可能符号求和
对 8 位字节数据,熵的取值范围约为 0~8:
| 熵范围 | 含义 | 典型示例 |
|---|---|---|
| 0 - 2 | 很低——高度重复 | 单字符重复、空字节、极简单模式 |
| 2 - 4 | 较低——种类有限 | 简单文本、基础结构化数据、多样性低 |
| 4 - 6 | 中等——常见文本/数据 | 自然语言文本、HTML、JSON、代码 |
| 6 - 7.5 | 较高——复杂或已压缩 | 压缩文件、编码数据、二进制可执行文件 |
| 7.5 - 8 | 很高——随机或已加密 | 加密数据、近似真随机数据、密码学密钥 |
单一字符重复,无随机性,每个字节完全可预测。
简单交替模式,符号种类少,故熵较低。
自然语言受字母频率等规律约束,熵处于中等水平。
随机 hex 串或加密内容往往接近最大熵。
CyberChef 的 Entropy Operation 对输入数据计算 Shannon 熵,便于判断数据的大致性质。可输出熵数值,并可选可视化。
熵很高(如 7.5+)常提示数据已加密或压缩;可用于发现加密文件、辅助检测隐写,或粗验加密是否「看起来像」随机数据。
比较压缩前后熵:若熵没有明显下降,数据可能本身已压缩或已加密,再压收益有限。
熵较高的口令通常更难猜。password123 熵低;7k$mQ9#xL2@nP 一类字符集更广、熵更高。
恶意样本常加壳或加密;可执行文件中出现高熵区段,可能对应被隐藏的有效载荷。
理想输出应接近 8.0;明显偏低可能存在偏差或可识别模式。
日志或流量中异常的高熵块,有时与外传数据(尤其经攻击者加密)相关,需结合上下文。
不同文件类型常有不同的典型熵区间:纯文本约 4~5,图像约 7~7.5,加密压缩包等可达 7.8+。
安全产品常用熵分析识别加密或混淆的恶意软件。现代勒索软件会加密文件,熵显著升高;监控文件熵变化有助于发现勒索行为。
将数据藏入图像等载体(隐写)可能略微抬高熵;结合统计方法有助于发现异常。
HTTPS、VPN 等加密协议载荷熵高。若在通常未加密的通道上出现持续高熵流量,需警惕隐蔽信道或数据外传。
密码学密钥的熵应非常接近理论最大值(8.0)。明显偏低可能意味着密钥生成薄弱,存在风险。
高熵只说明难预测,不等于安全或正确。完全随机的乱码熵也很高,却未必有用,必须结合场景。
英文、中文、程序代码的熵分布不同;解读时应考虑预期数据类型。
过短的样本统计不稳定;更长样本通常更可靠。
二者都可能提高熵;仅凭熵无法区分,需要其他分析手段。
同一文件不同区段熵可能差异很大;按块看熵有助于发现整体平均熵掩盖的结构。
与熵分析相关的组合示例(Operation 名称保持与软件一致):
熵恒 ≥ 0。熵为 0 表示完全可预测(仅一种符号)。不存在负熵。
若有 N 种等概率符号,最大熵为 log2(N)。对 8 位字节(256 种取值),最大熵为 log2(256) = 8 bits/byte。
对相互独立的信息源,总熵可分解为各部分熵之和;可用于分析拼接数据流。
熵给出了无损压缩的理论下界:在不丢失信息的前提下,无法把数据压到低于其熵所对应的比特数。