密码密钥硬编码检查

article/2025/9/29 3:48:51
摘要:本文重点讲述通过静态检查工具有效的防止密码密钥的泄露。

本文分享自华为云社区《密码密钥硬编码检查》,作者: Uncle_Tom。

Verizon《2022数据泄露调查报告(DBIR)》指出,61%的数据泄露涉及凭证数据,凭证是犯罪分子最喜欢的数据类型,就像披着羊皮的狼一样,它们的行为在攻击之前显得无害。凭证的泄露是信息泄露的主要途径,内部员工操作不规范、没有养成良好的工作行为习惯以及疏忽大意等已成为多起严重网络安全事件发生的根本原因。本文重点讲述通过静态检查工具有效的防止密码密钥的泄露。

1. 密钥的重要性

1.1. 看风

我们还是先说故事。话说2006年有一个柳云龙的电视连续剧《暗算》分为三部曲《听风》、《看风》、《捕风》。很有意思的是三个故事里都有个“风”字。你看过风吗?我没看到,只看见树叶飘动,才知道风来过。风,来无影,去无踪,无孔不入,又无处不在。三部曲分别对应:侦听、破译和谍报。故事描述了老一辈情报人员(一群与风打交道的人),与敌斗智斗勇的故事,信仰的力量让他们无所畏惧、勇往直前,看得人荡气回肠,催人泪下。

由于平时很少看电视,去年正在为一个算法发愁,偶然看到这个剧,感同身受,便一口气看完了,里面一些对加密算法逻辑的一些看法,还是给了当时的我很大的启发,让我完成了当时的算法,还特意发了微博纪念。 个人比较喜欢《看风》破译密码这个章节,里面有句经典的台词:风是看不见的,破译密码就是看见了风,密码是兵器,是兵器中的暗器。

1.2. 保密通信模型

  • 保密通信模型

密码学有一个重要的产物——密钥。密钥作为信息在传播时用来加密的工具起着非常重要的作用。主流的六种密码技术,就是围绕密钥展开的:对称密码、非对称密码、单向散列函数、消息认证码、数字签名、伪随机数生成器。

1.3. 密钥的重要性

  • 古典密码学(1949年之前)
    数据的安全主要是基于算法的保密。

送你一首小诗:

我画蓝江水悠悠,
爱晚亭上枫叶愁。
秋月溶溶照佛寺,
香烟袅袅绕经楼。

如果不告诉你这是首藏头诗,你还真的很难猜到唐伯虎对秋香的表白:“我爱秋香”。 藏头诗就是加密算法的一种。

由于西方文字是由字母组成,字母又是有序的字符集。所以在对文字加密时,密码算法很容易想到采用:替代密码、置换密码或替代与置换密码的组合,来完成完成信息的加密。公元前1世纪古罗马的凯撒密码,就是对文字中的字母,采用它在字母表中之后的第k个字母来代换。从而变成密文。在解密时,反向再移动k个字母进行还原。

这个时代将密码发展到巅峰的,要算二战时期德军用机械实现的转轮机(RotorMachine)ENIGMA密码,很多的谍战片都是围绕这个机器展开的。

这个时期的密码存在很多的问题:

  • 不适合大规模生产
  • 不适合较大的或者人员变动较大的组织
  • 用户无法了解算法的安全性

奥古斯特·柯克霍夫在19世纪提出了密码学上的柯克霍夫原则(Kerckhoffs’s principle)由:即使密码系统的任何细节已为人悉知,只要密钥(key)未泄漏,它也应是安全的。 这个原则指导了以后的密码学算法的发展。

  • 近代密码学(1949-1975)
    数据的安全基于密钥,而不是算法的保密。

香农在20世纪40年代末发表的一系列论文,特别是1949年的《保密系统通信理论》,把密码学推向了基于信息论的科学轨道。
这阶段的发展主要是对称加密算法。对称加密是发送方使用某种公开的算法使用密钥对明文进行加密,接收方使用之前发送方给予的密钥对密文进行解密得到明文。近代密码发展中一个重要突破是“数据加密标准”(DES)的出现。

  • 现代密码学(1976-)

公钥密码使得发送端和接收端无密钥传输的保密通信成为可能。

1976 年 Diffie 和 Hellman 的公钥密码的思想提出,标志着现代密码学的诞生。这是密码学发展史上具有里程碑意义的大事件,自此提出了许多种公钥密码体制 ,如基于分解大整数的困难性的密码体制——RSA 密码体制及其变种、基于离散对数问题的公钥密码体制。

1.4. 密钥泄露的危害

影响密码系统安全性的基本因素:密码算法复杂度、密钥机密性、密钥长度。其中密钥机密性与主要与密钥的管理相关。如何保护好密钥的安全就成了信息安全的非常重要的一个部分。

在现在的应用系统中,密码、密钥往往被作为一种访问密钥(access key)或凭证(Credentials),用于系统之间建立链接,避免了用户密码的明文传输。很多时候访问密钥等同于密码。

例如我们熟悉的GitHub的访问密钥。当我们获得Github某个库的地址访问密钥,就可以在Windows的凭证管理或本地Git的凭证管理里添加这个访问密钥,本地git和远端的访问库地址就建立了信任链接,不再需要每次都输入密码。

但密钥本地化,也会导致密钥分散在代码、配置文件中。一旦缺乏对密钥的统一管理, 就容易导致密钥泄露。员工不慎将密钥泄漏到开源网站导致重要数据丢失事件时有发生。

2018年某酒店集团共140G约5亿条个人信息遭泄露,被发现泄露的信息在境外黑市中售卖。究其原因,是该集团对员工的安全意识缺乏足够的教育培训,导致开发人员在无意识的情况下将公司测试平台的账号密码发到 GitHub上,使得黑客下载了整个数据。

我们从Verizon(美国最大的有线通信和语音通信提供商),每年发布的《数据泄露调查报告(Data Breach Investigations Report(DBIR))》,来看下密码密钥在信息泄露中被黑客利用的情况。

  • 《2020数据泄露调查报告(DBIR)》
    使用偷窃的信用凭证、利用员工误发送、员工误配置是数据泄露的主要威胁。内部员工操作不规范、没有养成良好的工作行为习惯以及疏忽大意等已成为多起严重网络安全事件发生的根本原因。

  • 《2021数据泄露调查报告(DBIR)》
    61%的数据泄露涉及凭证数据,凭证的泄露是信息泄露的主要途径,防止凭证泄露对信息保护有着重要的作用。

  • 《2022数据泄露调查报告(DBIR)》

    • 凭证是发起攻击的最重要的手段。

    • 凭证和个人数据是黑客最喜欢获取的两类数据
      报告指出:我们长期以来一直认为,凭证是犯罪分子最喜欢的数据类型,因为它们对于伪装成系统上的合法用户非常有用。就像谚语中披着羊皮的狼一样,它们的行为在攻击之前显得无害。

2. 密码密钥硬编码的检查

接下来我们看下如何防范密码密钥在带码中由于硬编码导致的泄露。

先来看些如何鉴别密码密钥。

2.1. 香农熵(Shannon entropy)

密钥的长度决定了密钥空间(keyspace),通常以位为单位。密钥空间越大,密钥被攻破的难度就越大。

密钥是由密钥空间的随机值构成。对于任意一个随机变量 X,它的熵定义如下:

变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大。

  • P(x_i)P(xi​) : 指的是单个样本变量所属的变量种类的个数占据所有变量个数的比例。

举例:数据data有六个值,分为别为:[a,b,c,a,b,a];

样本总个数是6,变量种类数3;分别为[a:3, b:2, c:1]

所以对应的pi分别为[a:1/2, b:1/3, c:1/6]

公式计算log以2为底数的pi的对数值,然后再乘以pi的负数,再计算其加和,得到的便是香农熵的值:1.4591479170272448。

/*** Base on shannon entropy return bits of entropy represented in string.* * @param str input string* @return entropy*/
public static double getShannonEntropy(String str) {int num = 0;Map<Character, Integer> pi = new HashMap<Character, Integer>();// count char in stringchar cx;for (int l = 0; l < str.length(); ++l) {cx = str.charAt(l);if (pi.containsKey(cx)) {pi.put(cx, pi.get(cx) + 1);} else {pi.put(cx, 1);}num = num + 1;}double entropy = 0.0;for (Map.Entry<Character, Integer> entry : pi.entrySet()) {cx = entry.getKey();double p = (double) entry.getValue() / num;entropy = entropy + p * (Math.log(p) / Math.log(2));}return -entropy;
}
  • 同等长度的字符串,通常密钥的熵值更高
    密钥为避免彩虹攻击,在取值上更加的离散,会尽量采用不重复的字符。就像我们为了增加密码的复杂性,要求长度不小于8,必须包含大小写、特殊字符、以及数字一样的道理。所以密钥的熵值会比一般的文本要高的多。我们就是利用这点来识别字符串是否是密钥。

2.2. 工具的检查逻辑

对于密码密钥的硬编码检查可以采用静态分析工具来完成。工具的检查过程通常包含四个过程:输入文件准备、检查、过滤和报告输出。

2.2.1. 输入文件转换

  • 输入文件分类
    我们需要检查的文本文件进行分类,通常包括以下几种类型:
    • 程序语言:C、C++、Java、Python、Go、Js等;
    • 有统一格式的文件:属性文件、yaml、csv、json、xml等;
    • 文本文件:没有固定格式的文本文件。

分类的目的是为了更好的识别文件中的字符串常量,充分利用字符串常量的上下文关联,以便在分析中最大程度的减少误报。

  • 输入文件转换
    • 程序语言:通过各语言的语法解析器,解析成抽象语法树,提取语法树中的等于字符串的常量,以及对应的变量名;
    • 有统一格式的文件:照格式转换成变量名和字符串常量值;
    • 文本文件:采用token的方式分割成一个个的token,变成一个各的字符串常量。

2.2.2. 密码密钥检查

在我们得到大量的变量名和字符串常量后,主要通过正则表达式匹配的方式完成目标的筛选。
由于检查密码密钥的种类和类型不同,可以通过配置文件来提高检查能力的可扩展性。

  • 检查配置选项主要包括以下内容:
信息描述选项
检查类型可分为:变量名、字符串常量、或两个都检查必选
密码密钥的类型用于区分不同类型的密码密钥;同时用于告警时区分具体检测到的密码密钥类型必选
正则表达式主要设定匹配的长度,每个字符的可选类型必选
熵值的阈值用于精确的识别密码密钥的类型,降低误报可选

例如:

  • 检查硬编码的口令:检查变量名中包含:password、passwd、pwd的变量,且变量等于字符串常量;正则表达式可以设置成为:".*(password|passwd|pwd)$"。
  • 检查GitHub的个人凭证:检查字符串常量;这个凭证是以"ghp_"开头的,跟随长度为36的字符串,且每个字符可以为数字和字母;正则表达式可以设置成为:“ghp_[0-9a-zA-Z]{36}”。

2.2.3. 密码密钥过滤

静态分析能很大程度上减少了人工审核的工作量,但由于检查模式的不确定性,也会带来不少的误报。误报会给用户在审核过程中带来很大的负面情绪,从而不愿继续使用工具。为了进一步降低误报,我们可以通过下面的方式来降低误报:

  • 密码密钥熵值的计算
    前面讨论过密码密钥的特点,可以通过检测密码密钥的信息熵的方式来降低误报。有些密码密钥设定了最低的阈值,但还是有很多密码密钥并未给出具体的阈值,这个就需要通过经验积累来设定,目前业界也有通过机器学习来完善这个阈值的设定。

  • 污点分析
    在代码中,对于口令的变量的取名上,很多并不会遵守可读性和可维护性来设定变量名,通过前面正则表达式的方式来查找硬编码密码的方式,会造成很多的漏报。这里还可以通过污点分析的方法,来推导出密码是否采用了硬编码。例如检查jdbc连接的密码参数,查看该参数是否为字符串常量。

2.2.4. 报告输出

将经过过滤后的结果,输出告警,给出可能泄露的文件名和变量或可能为密码密钥的常量字符串位置,便于人工的排查。

2.2.5. 参考工具

  • 华为云代码检查 CodeCheck:代码检查CodeCheck_精准定位_代码缺陷_安全检查_华为云

3. 参考

  • 柯克霍夫原则: https://en.wikipedia.org/wiki/Kerckhoffs's_principle
  • 香农信息熵:https://en.wikipedia.org/wiki/Entropy_(information_theory)
  • Verizon 2022年数据泄露报告:https://www.verizon.com/business/resources/reports/dbir/2022/master-guide/
  • Verizon 2021年数据泄露报告: https://www.verizon.com/business/resources/reports/dbir/2021/master-guide/
  • Verizon 2020年数据泄露报告: https://www.verizon.com/business/resources/reports/dbir/2020/master-guide/
  • GitHub 秘密扫描:About secret scanning - GitHub Docs)

点击关注,第一时间了解华为云新鲜技术~


http://chatgpt.dhexx.cn/article/Fgm2ckTF.shtml

相关文章

(D)TLS1.3大揭秘之密码技术

信息安全CIA 当今信息技术高速发展&#xff0c;信息安全越来越重要。信息安全是指保护完整可靠的数据仅能被授权访问&#xff0c;其包含三要素CIA&#xff1a;机密性&#xff08;Confidentiality&#xff09;、完整性&#xff08;Integrity&#xff09;、可用性&#xff08;Av…

用凯撒密码对喜欢的人表白

在密码学中&#xff0c;恺撒密码是一种最简单且最广为人知的加密技术。它是一种替换加密的技术&#xff0c;明文中的所有字母都在字母表上向后&#xff08;或向前&#xff09;按照一个固定数目进行偏移后被替换成密文。 例&#xff0c;当偏移量是3的时候&#xff0c;所有的字母…

计算机数字公式表白,love密码数字表白 数字表白公式

追逐女孩时&#xff0c;不能轻率地表达自己。一个人必须等到表达自己的时机成熟。然而&#xff0c;忏悔也是熟练的。如果你说得太直接&#xff0c;如果女孩不喜欢你&#xff0c;她们会感到尴尬。因此&#xff0c;我们不妨用一些不同的方式表达我们的爱&#xff0c;既有创意又不…

表白套路计算机公式,高级表白密码我喜欢你公式 套路喜欢的人

在表白的时候,并不是每个人都会主动说出我喜欢你,而是很难开口说出来。那么不如用高级表白密码我喜欢你公式吧,隐藏含蓄告诉对方。 高级表白密码我喜欢你 1、字母表白数字密码:9121522521= I LOVE U 表白解密:从1开始到26,分别表示从A到Z,即:A(1)B(2) C(3) D(4) E(5) F…

用计算机算术表白,数学表白密码

1. 那种表白的数学题算出来是521.1314 公式是什么来! 1.【(?+52.8)5-3.9343】0.5-10?+1=521.1314将 ? 的地方换成 1 【(1+52.8)5-3.9343】0.5-101+1 =【53.85-3.9343】0.5-10+1 =265.06570.5-10+1 =530.1314-10+1 =520.1314+1 =521.1314 用上面这个算式,无论算式中的【 ?…

用计算机计算告白密码,阿拉伯数字高级表白密码 很火的表白密码

04535 你是否想我 507680 我要追到你 518720 我一辈子爱你 92013 钟爱你一生 507680 我一定要追你 3344587 生生世世不变心 阿拉伯数字高级表白密码&#xff1a; 20475 爱你是幸福 52616 我暗恋你了 2030999 爱你想你久久久 阿拉伯数字表白密码&#xff0c;再也不只会说520(我爱…

用计算机表白的数字,数字表白密码 表白密码大全

数字表白相信很多人都不会陌生&#xff0c;除开常见的数字来代表爱慕之意&#xff0c;还有很多数字表白密码可以表达&#xff0c;一起来看表白密码大全。 一、数字表白密码 1、常见数字 (1)三位数 520&#xff0c;代表我爱你 521&#xff0c;代表我愿意 (2)四位数 3399&#xf…

信号的频率与采样频率_采样点数的关系

结论:1.产生的波形的点数的值就是采样数2.波形中相邻两点间隔的时间就是采样频率(Fs)的倒数3.信号频率就是信号的频率,影响的是信号发生函数4.产生的信号的总时间长度 t dt*采样数 采样数/Fs5.产生的信号的周期数 总时间长度/T 总时间长度*信号频率 采样数/采样频率*信号频…

【MATLAB】理解采样频率和信号频率的关系

文章目录 1 信号频率f12 信号频率f23 信号频率f54 信号频率f25 以绘制正弦信号举例&#xff1a; 1 信号频率f1 N50;%信号长度 fs50;%采样频率 f1;%信号频率 n[0:N-1]; tn/fs;%时间序列 ssin(2*pi*f*t); plot(s)信号的长度为50&#xff0c;信号的采样频率为50&#xff0c;fs/…

采样频率在频谱分析中的理解

学习rtl-sdr时碰到了FIR滤波器&#xff0c;提到归一化截止频率的公式&#xff1a; 便有了滤波与采样频率何干&#xff1f; 查阅相关资料后&#xff0c;发现自己将信号处理过程的各个过程脱节了。这要追溯到AD过程&#xff0c;模拟信号&#xff08;连续信号&#xff09;通过采样…

选择信号的采样频率和信号长度的技巧

在实际信号分析中经常会遇到要分辨出频率间隔为△f的两个分量&#xff0c;在这种情形中如何选择采样频率和信号的长度呢&#xff1f; 设有一个信号x&#xff08;t&#xff09;由三个正弦信号组成&#xff0c;其频率分别是f11Hz&#xff0c;f22.5Hz&#xff0c;f33Hz,即 x(t)sin…

信号带宽和采样频率

1、上升时间Tr0.3/BW&#xff0c;所以BW0.3/Tr (或者0.35)——这个是示波器最小采样带宽值 2、实际信号最大频率参考简易计算公式&#xff0c;频率拐点Fknee0.5/Tr,(10%-90%&#xff09;&#xff0c;0.4/Tr&#xff08;20%-80%&#xff09; 以下为转载&#xff1a; 示波器带宽…

【转载】采样频率、采样点数、频率分辨率

原作者&#xff1a; 辰忆书阁 原链接&#xff1a;http://www.360doc.com/myfiles.aspx?reg1&app1&type3 1、频率分辨率的2种解释 解释一&#xff1a;频率分辨率可以理解为在使用DFT时&#xff0c;在频率轴上的所能得到的最小频率间隔f0fs/N1/NTs1/T,其中N为采样点数…

采样位数、采样率、波特率

实例&#xff1a;16bit&#xff0c;16K&#xff0c;115200 1.采样位数&#xff1a; 即采样值或取样值&#xff08;就是将采样样本幅度量化&#xff09;。它是用来衡量声音波动变化的一个参数&#xff0c;也可以说是声卡的分辨率。它的数值越大&#xff0c;分辨率也就越高&…

matlab 采样点数,信号频率、采样频率、频率分辨率以及FFT信号补零

采样点数,信号频率、采样频率、采样点数的区分 包含matlab代码讲解示例 清晰明了 采样点数,信号频率、采样频率、采样点数 首先&#xff0c;频率指的是物质在单位时间内完成周期性变化的次数叫做频率&#xff0c;常用f表示。【公式】&#xff1a;f1/T&#xff0c;【物理学单位…

关于ADC采样的采样频率,采样时间的问题

关于ADC采样的采样频率&#xff0c;采样时间的问题&#xff1a;&#xff08;我目前的想法&#xff09; 一例题开讲&#xff1a; 信号源为5KHZ的正弦波&#xff08;一个周期&#xff09;&#xff0c;&#xff08;就已知周期为200us&#xff09;。 要求&#xff1a;完整的输出这个…

[信号基础] 信号频率,采样率,采样点(快拍数)等

参考&#xff1a; <2>信号频率、采样频率、采样点数 - 简书 <3>2.3 信号采样与采样定理 - 物联网前沿实践 <4>语音信号处理——常识与基本概念 - 凌逆战 - 博客园 <5>信号的时间域分辨率和频率域分辨率 - 知乎 <6>基础知识&#xff1a;采样频率和…

信号频率、采样频率、采样点数

f-信号频率fs-采样频率N-采样点数 信号频率&#xff08;f&#xff09;&#xff1a; 信号频率就是信号的频率&#xff0c;其倒数是信号一个周期的时间T。 采样点数&#xff08;N&#xff09;&#xff1a; 采样点数一次向PC端发送的数据量包含的点数&#xff0c;采样点数决定了每…

epel源究竟是什么

EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目&#xff0c;为“红帽系”的操作系统提供额外的软件包&#xff0c;适用于RHEL、CentOS和Scientific Linux. 使用很简单&#xff1a; 1. 首先我们需要安装一个叫”epel-release”的软件包&#xff0c;这个软件…

linux7 epel源,为CentOS7添加EPEL源

8种机械键盘轴体对比 本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f; EPEL (Extra Packages for Enterprise Linux) 是Fedora小组维护的一个软件仓库项目&#xff0c;为RHEL/CentOS提供他们默认不提供的软件包。这个源兼容RHEL以及像…