5 分钟速通密码学!
让我们开始第一部分:密码学基础 (Cryptography Basics)。
第一部分:密码学基础 (Cryptography Basics)
1. 什么是密码学?
想象一下,在古代战争中,将军需要向远方的部队传递作战指令。如果直接派人送信,信件一旦被敌人截获,后果不堪设想。怎么办呢?他们会用一种秘密的“语言”来写信,只有自己人才能看懂。这种把信息变“秘密”的技术,就是密码学的雏形。
密码学 (Cryptography),简单来说,就是研究如何安全通信的科学与艺术。它涉及到一系列的方法和技术,用于保护信息不被未经授权的第三方读取或修改。
密码学的目标主要有以下几个方面:
- 保密性 (Confidentiality):确保信息只被授权的人访问。就像给信件上了锁,只有拥有钥匙的人才能打开。
- 完整性 (Integrity):确保信息在传输或存储过程中没有被篡改。就像给信件盖上火漆印,如果印章完好,就说明信件内容没有被动过。
- 可用性 (Availability):确保授权用户在需要时能够访问到信息和相关资源。就像确保你的钥匙随时能打开你的锁一样。
- 认证 (Authentication):确认通信双方的身份是真实的,而不是冒名顶替。就像通过核对笔迹或暗号来确认对方的身份。
- 不可否认性 (Non-repudiation):确保发送者不能否认其发送过某条信息,接收者也不能否认其接收过某条信息。就像签了名的合同,不能抵赖。
在网络安全中的重要性:
在数字时代,我们的个人信息、金融交易、商业机密等都以数据的形式在网络上传输和存储。如果没有密码学的保护,这些敏感信息就如同裸奔在互联网上,极易受到窃听、篡改和滥用。
- 保护在线交易:你每次在网上购物输入银行卡信息时,密码学都在背后默默保护着你的数据不被泄露。
- 保障通信安全:你使用的微信、WhatsApp等即时通讯工具,很多都采用了端到端加密技术,确保只有你和聊天对象能看到消息内容。
- 维护数据隐私:从个人照片到企业数据库,密码学帮助我们加密存储数据,防止数据泄露。
- 确保软件安全:软件更新、数字证书等都依赖密码学来验证其来源的真实性和完整性。
可以说,密码学是构建现代网络安全的基石。理解密码学的基本原理,对于我们认识和应对网络威胁至关重要。
2. 核心概念与术语
学习任何一门学科,都需要先掌握它的基本“行话”。下面是一些密码学中非常核心的概念和术语:
- 明文 (Plaintext):指未经加密的、可以直接理解的原始信息。比如,你想发送的消息“明天上午10点开会”。
- 生活化比喻:明文就像你用大白话写的普通信件。
- 密文 (Ciphertext):指明文经过加密处理后得到的信息,通常看起来是一串无意义的乱码。比如,“明天上午10点开会”加密后可能变成“Xf5#gH@&kLpQwR”。
- 生活化比喻:密文就像是用密码本翻译过的“火星文”信件,不懂密码本的人完全看不懂。
- 加密 (Encryption):将明文转换为密文的过程。这个过程通常需要一个加密算法和一个密钥。
- 生活化比喻:加密就像是把普通信件锁进一个保险箱的过程。
- 解密 (Decryption):将密文还原为明文的过程。这个过程通常也需要一个解密算法和一个密钥(通常与加密密钥相关)。
- 生活化比喻:解密就像是用正确的钥匙打开保险箱,取出里面的信件。
- 密钥 (Key):这是一段秘密信息,用于控制加密和解密的过程。密钥的保密性至关重要,一旦密钥泄露,密文就可能被破解。
- 生活化比喻:密钥就是打开保险箱的那把独一无二的钥匙。
- 根据密钥的使用方式,主要分为两大类:
- 对称密钥 (Symmetric Key):加密和解密使用相同的密钥。就像你用同一把钥匙锁上和打开同一个锁。
- 非对称密钥 (Asymmetric Key):加密和解密使用不同但配对的密钥,一个叫公钥 (Public Key),一个叫私钥 (Private Key)。我们后面会详细讲。
- 算法 (Algorithm/Cipher):指进行加密或解密的一套明确的规则或数学过程。例如,著名的AES、DES、RSA等都是加密算法。
- 生活化比喻:算法就像是保险箱的内部构造和锁的设计图纸,它规定了如何用钥匙把东西锁进去,以及如何用钥匙把东西取出来。
3. 密码学简史与分类
密码学的历史源远流长,几乎和人类的文字史一样悠久。
- 古典密码 (Classical Ciphers):这些是早期使用的密码,通常基于字符的替换或移位。
- 凯撒密码 (Caesar Cipher):据说由古罗马的凯撒大帝发明,非常简单。它将字母表中的每个字母向后(或向前)移动固定位数。例如,如果密钥是3,A就变成D,B就变成E,以此类推。这种密码很容易被频率分析破解。
- 小例子:明文
HELLO
,密钥3
,密文KHOOR
。
- 小例子:明文
- 维吉尼亚密码 (Vigenère Cipher):这是一种多表代换密码,比凯撒密码更复杂一些。它使用一个关键词作为密钥,根据关键词的不同字母来决定明文字母的移位位数。它在一段时间内被认为是“不可破译的密码”,但后来也被破解了。
- 凯撒密码 (Caesar Cipher):据说由古罗马的凯撒大帝发明,非常简单。它将字母表中的每个字母向后(或向前)移动固定位数。例如,如果密钥是3,A就变成D,B就变成E,以此类推。这种密码很容易被频率分析破解。
- 现代密码 (Modern Ciphers):随着计算机技术的发展,现代密码学应运而生。它们基于复杂的数学原理,安全性远超古典密码。
- 对称密码体制 (Symmetric Cryptography):也称为秘密密钥密码体制或单密钥密码体制。其特点是加密和解密过程使用相同的密钥。常见的对称加密算法有 DES、3DES、AES、RC4、Blowfish等。
- 优点:加密解密速度快,效率高。
- 缺点:密钥分发困难。如何安全地把同一个密钥告诉通信的另一方是个大问题。
- 非对称密码体制 (Asymmetric Cryptography):也称为公钥密码体制。其特点是加密和解密使用一对不同的密钥:公钥和私钥。公钥可以公开,任何人都可以获取;私钥则由拥有者秘密保管。用公钥加密的信息只能用对应的私钥解密;用私钥签名(一种特殊的加密)的信息可以用对应的公钥验证。常见的非对称加密算法有 RSA、ECC、Diffie-Hellman等。
- 优点:解决了密钥分发问题,可以实现数字签名等功能。
- 缺点:加密解密速度相对较慢。
- 对称密码体制 (Symmetric Cryptography):也称为秘密密钥密码体制或单密钥密码体制。其特点是加密和解密过程使用相同的密钥。常见的对称加密算法有 DES、3DES、AES、RC4、Blowfish等。
通常在实际应用中,我们会结合使用对称加密和非对称加密的优点。例如,在HTTPS中,浏览器和服务器会先用非对称加密协商一个临时的对称密钥,然后用这个对称密钥进行后续的大量数据加密传输,这样既安全又高效。
思考题:
- 你能用自己的话解释一下“保密性”和“完整性”在密码学中的区别吗?试着举一个生活中的例子。
- 如果小明使用凯撒密码,密钥是5,他想加密消息
ATTACK
,那么密文会是什么? - 对称加密和非对称加密最主要的区别是什么?它们各自有什么优缺点?
非常好!很高兴看到大家对密码学的基础知识有了清晰的认识。现在,让我们深入学习一个在现代密码学中占据核心地位的概念——公钥加密。
第二部分:公钥加密基础 (Public Key Cryptography Basics)
1. 对称加密的局限性
在上一部分我们提到,对称加密(Symmetric Cryptography)的特点是加密和解密使用相同的密钥。这种方式速度快、效率高,非常适合加密大量数据。
但是,它有一个致命的“阿喀琉斯之踵”——密钥分发难题 (Key Distribution Problem)。
想象一下,你想和远在千里之外的朋友小红进行秘密通信。你们约定使用对称加密。那么问题来了:
- 你怎么把这个共享的密钥安全地告诉小红呢?
- 如果通过普通邮件或电话告诉她,那密钥不就可能被窃听了吗?一旦密钥泄露,你们所有的秘密通信都将暴露无遗。
- 如果派专人护送密钥,成本又太高,尤其是在需要和很多人进行秘密通信的场景下(比如一个电商网站需要和成千上万的用户建立安全连接)。
在互联网这样开放的环境中,安全地分发对称密钥是一个非常棘手的问题。这就好比你想给朋友一个保险箱的钥匙,但你又不能当面给他,通过邮寄的方式又怕钥匙被别人复制。
正是为了解决这个密钥分发难题,以及实现一些对称加密无法完成的功能(如数字签名),公钥密码体制应运而生。
2. 公钥密码体制(非对称加密)
公钥密码体制 (Public Key Cryptography),也称为非对称加密 (Asymmetric Cryptography),它的核心思想非常巧妙:使用一对密钥,而不是单个密钥。
这一对密钥是数学上相关的,它们分别是:
- 公钥 (Public Key):顾名思义,这个密钥是公开的。你可以把它告诉任何人,或者发布在互联网上,就像公开你的邮箱地址或电话号码一样。
- 私钥 (Private Key):这个密钥是秘密的,必须由密钥的拥有者妥善保管,绝不能泄露给他人。就像你的银行卡密码一样,只能自己知道。
工作原理:
这对密钥的神奇之处在于它们的配对工作方式:
-
用于保密通信(加密/解密):
- 发送者(比如你)想给接收者(比如小红)发送一条秘密消息。
- 你首先获取小红的公钥(这个公钥是公开的,你可以从小红的网站、名片或者一个可信的目录中得到)。
- 你用小红的公钥来加密你的消息。
- 加密后的密文通过不安全的网络(比如互联网)发送给小红。
- 即使这个密文被黑客截获,黑客没有小红的私钥,也无法解密它。
- 小红收到密文后,使用她自己秘密保管的私钥来解密,就能得到原始消息。
关键点:用某个公钥加密的数据,只能用其配对的私钥才能解密。
- 生活化比喻:想象小红有一个特制的保险箱(她的私钥)和很多把只能锁上这个保险箱但不能打开的“锁”(她的公钥)。她把这些“锁”分发给所有想给她寄密信的人。你想给小红寄密信,就找她要一把“锁”,把信锁好后寄给她。只有小红用她自己保管的保险箱钥匙(私钥)才能打开看到信的内容。
-
用于数字签名(身份验证/完整性):
- 发送者(比如你)想发送一条消息,并让接收者(比如小红)确信这条消息确实是你发的,并且没有被篡改。
- 你首先用自己的私钥对消息(或者消息的哈希值,我们后面会讲哈希)进行“签名”(这本质上也是一种加密操作)。
- 你把原始消息和这个“数字签名”一起发送给小红。
- 小红收到消息和签名后,使用你的公钥(这个公钥是公开的)来验证这个签名。
- 如果验证成功,小红就能确信:
- 这条消息确实是你发送的(因为只有你拥有你的私钥)。
- 这条消息在传输过程中没有被修改过(因为如果消息被改动,签名验证就会失败)。
关键点:用某个私钥“签名”(加密)的数据,可以用其配对的公钥来“验证”(解密)。
- 生活化比喻:这就像你在文件上盖上你独一无二的私章(用私钥签名)。任何人都可以通过比对你预先公开备案的印章样本(公钥)来确认这个文件确实是你盖的章,并且内容没有被涂改。
3. 常见公钥算法简介
目前有很多成熟的公钥加密算法,它们基于不同的数学难题(比如大数分解、离散对数问题)。这里介绍几个最著名的:
- RSA算法:
- 由三位密码学家 Rivest, Shamir, Adleman 在1977年提出,是目前应用最广泛的公钥加密算法之一。
- 其安全性基于大整数分解的困难性。简单来说,就是给你两个很大的素数,把它们乘起来很容易;但是给你它们的乘积,想反向分解出原来的两个素数则非常非常困难。
- 应用场景:数字签名、密钥交换(比如在TLS/SSL握手过程中交换对称密钥)、数据加密(虽然由于速度较慢,通常不直接用于加密大量数据,而是用于加密对称密钥)。
- ECC(椭圆曲线密码学 - Elliptic Curve Cryptography):
- 一种基于椭圆曲线数学的公钥加密方法。
- 优势:与RSA相比,ECC可以使用更短的密钥长度达到同等的安全强度。这意味着更小的存储空间、更快的计算速度和更低的带宽消耗。因此,ECC在资源受限的设备(如智能手机、物联网设备)和对性能要求较高的场景中越来越受欢迎。
- 应用场景:比特币等加密货币的密钥生成和签名、TLS/SSL、无线通信等。
- Diffie-Hellman密钥交换算法:严格来说,它不是一个加密算法,而是一个密钥协商协议。它允许两个从未见过面的人通过不安全的信道安全地协商出一个共享的对称密钥,然后他们就可以用这个对称密钥进行加密通信了。这是公钥密码学的开创性成果之一。
4. 公钥基础设施 (PKI - Public Key Infrastructure) 简介
公钥加密虽然解决了密钥分发问题,但也引入了一个新的问题:我怎么能确定我拿到的这个公钥确实是小红的,而不是冒名顶替的黑客的呢? 如果黑客伪造了小红的公钥给你,你用这个假公钥加密了信息,那么黑客就能用他对应的假私钥解密你的信息了!
为了解决公钥的信任问题,公钥基础设施 (PKI) 应运而生。PKI 是一套由硬件、软件、策略、流程和人员组成的体系,用于创建、管理、分发、使用、存储和撤销数字证书 (Digital Certificates)。
- 数字证书:可以把它想象成一个数字身份证。它由一个受信任的证书颁发机构 (CA - Certificate Authority) 签发,将一个公钥与一个实体(如个人、组织、网站服务器)的身份信息绑定在一起。
- 证书中包含了公钥本身、公钥所有者的信息、CA的数字签名等。
- 证书颁发机构 (CA):是一个可信任的第三方机构,负责验证申请者的身份,并为其签发数字证书。例如,VeriSign (现在是DigiCert的一部分), Let’s Encrypt 等都是著名的CA。
当你访问一个使用HTTPS的网站(比如银行网站)时,你的浏览器会自动检查该网站的数字证书。如果证书是由一个受信任的CA签发的,并且证书有效,浏览器就会认为这个网站的公钥是可信的,然后才会用这个公钥进行后续的安全通信。
5. 应用场景
公钥加密技术已经深深融入我们数字生活的方方面面:
- HTTPS/TLS/SSL 安全通信:你每次在浏览器地址栏看到
https://
和小锁图标,背后都是公钥加密在发挥作用,确保你与网站之间的数据传输是加密和认证的。 - 数字签名与身份验证:用于验证软件更新的来源、电子文档的真实性、用户的登录凭证等。
- 安全电子邮件 (PGP/GPEP - Pretty Good Privacy / GNU Privacy Guard):允许用户加密和签名他们的电子邮件,确保邮件内容的保密性和发件人的真实性。
- 安全外壳协议 (SSH):系统管理员经常使用SSH远程登录服务器,SSH也使用公钥加密进行身份验证和安全通信。
- 加密货币:比特币、以太坊等加密货币的交易和钱包地址都依赖于公钥加密技术。
思考题:
- 小明想给小红发送一封加密邮件。他应该使用谁的公钥来加密邮件?小红收到邮件后,应该使用谁的私钥来解密?
- 如果一个网站声称自己是某银行的官方网站,你如何通过数字证书来初步判断它的可信度?(提示:可以想想CA的角色)
- 为什么说RSA算法的安全性依赖于大数分解的困难性?你能用自己的话解释一下吗?
太棒了!很高兴大家对公钥加密的知识点掌握得这么好!
现在,我们已经了解了对称加密和非对称加密。接下来,我们要学习一个与它们都不同,但在信息安全领域同样扮演着关键角色的技术——哈希函数 (Hashing Functions)。
第三部分:哈希基础 (Hashing Basics)
1. 什么是哈希函数?
想象一下,你有一本很厚的小说,你想给这本书生成一个简短的、独一无二的“指纹”,通过这个“指纹”就能快速识别这本书,并且如果书的内容有任何微小的改动(比如增删了一个字),这个“指纹”就会变得完全不同。哈希函数做的就是类似的事情。
哈希函数 (Hash Function),也常被称为散列函数,是一种数学函数,它可以将任意长度的输入数据(比如一段文字、一个文件、一张图片,甚至整个数据库)通过一个固定的计算过程,转换为一个固定长度的输出字符串。这个输出字符串就被称为哈希值 (Hash Value)、哈希码 (Hash Code)、摘要 (Digest) 或指纹 (Fingerprint)。
哈希函数的重要特性:
一个优秀的哈希函数通常具备以下几个关键特性,这些特性使得它们在各种应用中非常有用:
- 单向性 (One-way Property) / 不可逆性 (Irreversibility):
- 从原始输入数据计算出哈希值非常容易(计算速度快)。
- 但是,从哈希值反向推导出原始输入数据在计算上是极其困难的,甚至是不可行的。也就是说,你不能轻易地从“指纹”还原出整本书的内容。
- 生活化比喻:就像把鸡蛋打散做成炒鸡蛋很容易,但想把炒鸡蛋完美地还原成原来的生鸡蛋几乎不可能。
- 确定性 (Deterministic):
- 对于相同的输入数据,无论你计算多少次,哈希函数总是产生完全相同的哈希值。
- 生活化比喻:同一本书,无论你用同一种指纹提取技术提取多少次,得到的指纹都应该是一样的。
- 雪崩效应 (Avalanche Effect) / 高灵敏性:
- 原始输入数据即使发生非常微小的变化(比如修改了一个比特位,或一个字符),其计算出的哈希值也会发生巨大且不可预测的变化,看起来与原来的哈希值毫无关联。
- 生活化比喻:书中的一个标点符号改了,提取出来的“指纹”就会变得面目全非。
- 抗碰撞性 (Collision Resistance):
- 理想情况下,不同的输入数据应该产生不同的哈希值。如果两个不同的输入数据产生了相同的哈希值,就称之为一个“碰撞 (Collision)”。
- 弱抗碰撞性 (Weak Collision Resistance):对于一个给定的输入数据
x
,要找到另一个不同的输入数据y
,使得hash(x) = hash(y)
,在计算上是困难的。 - 强抗碰撞性 (Strong Collision Resistance):要找到任意两个不同的输入数据
x
和y
,使得hash(x) = hash(y)
,在计算上是困难的。 - 生活化比喻:很难找到两本内容完全不同的书,它们却拥有完全相同的“指纹”。(虽然理论上由于输出长度固定而输入无限,碰撞是可能存在的,但对于好的哈希算法,找到碰撞的概率极低,成本极高。)
2. 哈希函数与加密的区别
这是一个非常重要的区分点,初学者很容易混淆:
特性 | 哈希函数 (Hashing) | 加密 (Encryption) |
---|---|---|
目的 | 主要用于验证数据的完整性和唯一性 | 主要用于保护数据的保密性 |
可逆性 | 不可逆 (单向) | 可逆 (有对应的解密过程) |
密钥 | 通常不需要密钥 | 需要密钥 (对称密钥或公私钥对) |
输出长度 | 固定长度 | 通常与输入长度相关或更长 |
用途举例 | 文件校验和、密码存储、数字签名中的摘要 | 安全通信 (HTTPS)、数据存储加密、磁盘加密等 |
简单来说:
- 加密是为了让信息不被别人看懂,但授权的人可以用密钥恢复原始信息。
- 哈希是为了给信息生成一个“指纹”,主要用来检查信息有没有被改动过,或者快速比较两个信息是否相同,但你不能从指纹恢复出原始信息。
3. 常见哈希算法
历史上出现过很多哈希算法,有些随着技术发展和安全分析的深入,已经被认为不再安全。以下是一些知名的哈希算法:
- MD5 (Message Digest 5):
- 由Ronald Rivest在1991年设计,产生一个128位(16字节)的哈希值。
- 曾经非常流行,广泛用于文件校验、密码存储等。
- 安全缺陷:MD5已经被证明存在严重的碰撞漏洞,意味着可以相对容易地找到两个不同的输入产生相同的MD5哈希值。因此,MD5不再适用于对安全性要求高的场景,例如SSL证书签名或数字签名。但对于非安全关键的应用,如文件完整性校验(检查文件下载是否损坏),有时仍在使用。
- SHA系列 (Secure Hash Algorithm):由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布的一系列哈希算法。
- SHA-0:早期版本,很快被发现存在缺陷并被SHA-1取代。
- SHA-1:产生一个160位(20字节)的哈希值。也曾广泛使用,但与MD5类似,SHA-1也已被发现存在碰撞攻击的风险,虽然比MD5更难。目前也不推荐用于新的安全应用。
- SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256):这是一组更强大的哈希函数,分别产生不同长度的哈希值(例如,SHA-256产生256位哈希值)。目前,SHA-256是应用最广泛且被认为是安全的哈希算法之一,用于数字签名、区块链(如比特币)、TLS/SSL证书等多种安全应用。
- SHA-3 (Keccak):在2015年正式发布的最新一代哈希算法标准。它采用了与SHA-1和SHA-2不同的内部结构(海绵结构),旨在提供一种不同于以往算法的安全替代方案。目前正在逐步推广应用。
选择哪种哈希算法取决于具体的安全需求和应用场景。一般来说,推荐使用SHA-2系列(如SHA-256)或SHA-3。
4. 哈希函数的应用
哈希函数的独特性质使其在计算机科学和信息安全领域有着极其广泛的应用:
- 密码存储 (Password Storage):
- 网站或系统通常不会直接存储用户的明文密码,因为一旦数据库泄露,所有用户密码都会暴露。
- 正确的做法是存储用户密码的哈希值。当用户登录时,系统计算用户输入密码的哈希值,并与数据库中存储的哈希值进行比较。如果匹配,则认证通过。
- 为了进一步增强安全性,通常还会使用“加盐 (Salting)”技术:在计算密码哈希之前,为每个用户的密码附加一个随机生成的字符串(盐值),然后再进行哈希。这样即使两个用户设置了相同的密码,由于盐值不同,它们存储的哈希值也会不同,可以有效抵御彩虹表攻击 (Rainbow Table Attack)。
- 数据完整性校验 (Data Integrity Verification):
- 当你从网站下载一个大文件(如操作系统镜像、大型软件安装包)时,网站通常会提供该文件的哈希值(如MD5或SHA-256校验和)。
- 下载完成后,你可以在本地计算下载文件的哈希值,并与网站提供的哈希值进行比较。如果两者一致,说明文件在下载过程中没有损坏或被篡改。
- 数字签名 (Digital Signatures):
- 在公钥加密中,如果要对一个大文件进行签名,直接用私钥加密整个文件会非常慢。
- 通常的做法是:先计算文件的哈希值(得到一个固定长度的摘要),然后用发送者的私钥对这个哈希值进行加密(签名)。
- 接收者收到文件和签名后,用发送者的公钥解密签名得到原始哈希值,同时自己计算接收到文件的哈希值,比较两者是否一致。
- 区块链 (Blockchain):
- 区块链技术(如比特币)的核心组成部分就是哈希函数。
- 每个区块都包含前一个区块的哈希值,形成一个链式结构,确保了数据的不可篡改性。交易数据也通过哈希进行组织和验证。
- 数据索引与查找:
- 哈希表(Hash Table)或散列表是一种常用的数据结构,它利用哈希函数将键(Key)映射到表中的一个位置,以加快查找速度。
思考题:
- 为什么在存储用户密码时,仅仅使用哈希函数还不够安全,通常还需要“加盐”?
- 小明下载了一个软件,网站提供了该软件的SHA-256校验和。小明应该如何操作来验证他下载的软件是否完整且未经篡改?
- 哈希函数能用于加密数据吗?为什么?
有一点没懂,非对称加密 rsa 和对称加密Diffie-Hellman的区别?不都是交换公钥吗?
非常好的问题!确实,RSA和Diffie-Hellman都涉及到“公钥”的概念,但它们的目的和工作方式有显著的区别。让我们来梳理一下:
首先,澄清一个常见的误解:
- RSA (Rivest-Shamir-Adleman) 是一种 非对称加密算法。它确实使用公钥和私钥对。它的主要用途是:
- 加密/解密:用公钥加密数据,用对应的私钥解密。
- 数字签名:用私钥签名数据,用公钥验证签名。
- Diffie-Hellman (DH) 本身 不是一个加密算法,而是一个 密钥交换协议。它的核心目标是让通信双方在不安全的信道上安全地协商出一个共享的密钥(通常是对称密钥),然后双方可以使用这个共享密钥通过对称加密算法(如AES)进行后续的保密通信。
核心区别:
-
目的不同:
- RSA:可以直接用于加密少量数据(如会话密钥)或进行身份认证(通过数字签名)。
- Diffie-Hellman:专门用于安全地生成一个共享密钥,它本身不执行数据加密。
-
“公钥”的含义和使用方式不同:
- RSA中的公钥:
- 用于加密:任何人都可以获取接收方的公钥,用它加密信息,只有持有对应私钥的接收方才能解密。
- 用于验证签名:任何人都可以获取签名者的公钥,用它验证签名的真实性和数据的完整性。
- 公钥是直接分发的,比如通过数字证书。
- Diffie-Hellman中交换的“公开值”:
- 双方各自生成一个私有值(秘密数字)和一个公开值(基于私有值和一组公共参数计算得出)。
- 他们交换的是这些“公开值”。
- 然后,每一方结合自己的私有值和对方的公开值,通过特定的数学运算,可以独立计算出完全相同的共享密钥。
- 关键在于:这个最终的共享密钥从未在信道中直接传输过。即使攻击者截获了双方交换的公开值和公共参数,也无法轻易计算出这个共享密钥(这依赖于离散对数问题的困难性)。
- RSA中的公钥:
-
是否直接加密数据:
- RSA:可以。例如,A可以用B的公钥加密一个对称密钥,然后发送给B。B用自己的私钥解密得到对称密钥,之后双方用此对称密钥通信。
- Diffie-Hellman:不可以。它只负责生成共享密钥。数据加密需要依赖其他对称加密算法。
总结一下“不都是交换公钥吗?”这个问题:
- RSA 中,一方(比如服务器)会将其 公钥 发送给另一方(比如客户端)。客户端用这个公钥加密信息(比如一个预主密钥,用于后续生成对称密钥)。
- Diffie-Hellman 中,双方交换的是根据各自私钥计算出的 公开参数/值,而不是直接意义上的“用于加密的公钥”。它们利用这些交换的公开值和自己的私钥来独立推导出同一个共享秘密。
一个简单的比喻:
- RSA (用于加密会话密钥):
- Alice想给Bob寄一个秘密盒子(对称密钥)。
- Bob先把一个打开的保险箱(Bob的公钥)寄给Alice。
- Alice把秘密盒子放进Bob的保险箱,锁上(用Bob的公钥加密)。
- Alice把锁上的保险箱寄回给Bob。
- 只有Bob有钥匙(Bob的私钥)能打开这个保险箱,取出秘密盒子。
- Diffie-Hellman (密钥交换):
- Alice和Bob想共同调配出一种只有他们两人知道的秘密颜色油漆(共享密钥)。
- 他们先公开商定一种基础颜色(公共参数)。
- Alice选一种自己的秘密颜色,和基础颜色混合,把混合后的颜色公开给Bob。
- Bob也选一种自己的秘密颜色,和基础颜色混合,把混合后的颜色公开给Alice。
- 现在,Alice用Bob给她的混合颜色,再混合上自己最初的秘密颜色。
- Bob用Alice给他的混合颜色,再混合上自己最初的秘密颜色。
- 神奇的是,他们最终得到的油漆颜色是完全一样的!而偷听者即使知道基础颜色和他们交换的混合颜色,也很难知道他们各自的秘密颜色,以及最终的共享颜色。
所以,虽然都涉及公开信息的交换,但RSA是直接用对方的公钥进行操作(加密或验证),而Diffie-Hellman是通过交换计算出的公开值来共同派生出一个秘密,这个秘密本身不被直接传输。
太棒了!同学们,看到大家对密码学、公钥加密和哈希函数都有了扎实的理解,我感到非常欣慰!这些都是我们数字世界安全的基石。
现在,我们已经掌握了足够的理论知识,是时候进入更具实践性的部分了——学习如何使用 John the Ripper (JtR) 这款强大的密码破解与审计工具。请注意,我们学习这个工具的目的是为了更好地理解密码安全和进行合法的安全测试,严禁用于任何非法用途。
第四部分:John the Ripper 工具使用
1. 什么是 John the Ripper (JtR)?
John the Ripper,通常简称为 JtR 或 John,是一款非常著名且功能强大的开源密码破解(或称为密码恢复/审计)工具。
- 它的主要用途是什么?
- 密码安全审计:系统管理员可以使用JtR来检测系统中的弱密码,提醒用户修改,从而增强整体安全性。
- 密码恢复:在合法授权的情况下,帮助用户恢复忘记的密码(例如,从自己系统的密码哈希中恢复)。
- 安全研究与教育:帮助安全研究人员和学生理解密码破解的原理和不同密码方案的强度。
- 它能破解哪些类型的密码?
- JtR支持破解种类繁多的密码哈希和加密格式。这包括但不限于:
- 各种Unix风格的密码哈希 (如 DES, MD5, SHA-crypt, Blowfish-crypt 等,通常存储在
/etc/shadow
文件中)。 - Windows LM 和 NTLM 哈希 (用于Windows用户账户密码)。
- 各种应用程序的密码哈希 (如数据库、Web应用、Office文档、压缩文件如ZIP/RAR等)。
- 网络协议中的认证哈希 (如 Kerberos, LDAP)。
- 甚至一些较弱的加密密钥。
- 各种Unix风格的密码哈希 (如 DES, MD5, SHA-crypt, Blowfish-crypt 等,通常存储在
- JtR通过其模块化的设计,可以支持非常多的格式,并且社区也在不断为其添加新的格式支持。
- JtR支持破解种类繁多的密码哈希和加密格式。这包括但不限于:
- 支持的操作系统:
- JtR最初是为Unix系统设计的,但现在它是一个跨平台的工具,可以在多种操作系统上运行,包括:
- Linux (各种发行版)
- macOS
- Windows
- 以及其他类Unix系统 (如 *BSD, Solaris等)。
- JtR最初是为Unix系统设计的,但现在它是一个跨平台的工具,可以在多种操作系统上运行,包括:
2. 安装 John the Ripper
JtR的安装方式因操作系统而异。通常有两种主要的JtR版本:
- Core John (核心版):这是官方发布的稳定版本,包含了主要的破解功能和格式支持。
- Jumbo John (社区增强版):这是一个由社区维护和增强的版本,通常包含更多最新的破解格式、优化和功能。对于大多数用户来说,推荐使用 Jumbo John,因为它功能更全面。
安装方法概述:
- Linux (如 Debian/Ubuntu):
这通常安装的是核心版或一个较旧的Jumbo版。为了获取最新的Jumbo版,你可能需要从源码编译安装,或者查找特定发行版的社区仓库。sudo apt update sudo apt install john
- Linux (从源码编译 Jumbo John - 推荐方式):
- 访问 John the Ripper 社区版 (Jumbo) 的 GitHub 页面。
- 下载最新的源码包 (通常是
.tar.gz
或.zip
文件) 或使用git clone
。 - 解压源码包,进入
src
目录。 - 运行
./configure
和make -s clean && make -sj4
(这里的4
是你的CPU核心数,可以调整)。 - 编译完成后,可执行文件通常在
run
目录下 (如john
)。
- macOS:
- 可以使用 Homebrew 包管理器安装:
或者,为了获得Jumbo版,可以使用:brew install john
brew install john-jumbo
- 同样也可以从源码编译安装。
- 可以使用 Homebrew 包管理器安装:
- Windows:
- 可以从 John the Ripper 官方网站 或 Jumbo John 的 GitHub 发布页面下载预编译的Windows二进制包 (通常是
.zip
文件)。 - 解压后,在
run
目录下找到john.exe
即可运行。
- 可以从 John the Ripper 官方网站 或 Jumbo John 的 GitHub 发布页面下载预编译的Windows二进制包 (通常是
验证安装:
安装完成后,你可以在命令行中运行以下命令来检查JtR是否成功安装并查看其版本信息:
cd path/to/john/run # 进入JtR的运行目录
./john --version # Linux/macOS
# john.exe --version # Windows
3. JtR 的基本工作流程
使用JtR破解密码通常遵循以下步骤:
- 准备密码哈希文件 (Input File):
- 首先,你需要获取你想要破解的密码的哈希值。这些哈希值必须以JtR能够识别的格式存放在一个文本文件中。
- 例如,对于Linux系统,你可能需要从
/etc/shadow
文件中提取用户账户信息(这通常需要root权限)。对于Windows,可能需要从SAM数据库中提取NTLM哈希。 - JtR自带了一些工具(如
unshadow
用于合并/etc/passwd
和/etc/shadow
,pwdump
的变种用于Windows)来帮助你准备这些哈希文件。 - 重要提示:获取密码哈希通常需要相应的权限,并且必须在合法授权的情况下进行。
- 选择破解模式 (Cracking Mode):
- JtR提供了多种破解模式,以适应不同的情况和密码复杂度。我们稍后会详细介绍这些模式。
- 运行破解 (Run John):
- 执行
john
命令,指定哈希文件和选择的破解模式(或让JtR自动尝试)。
- 执行
- 查看破解结果 (Show Cracked Passwords):
- JtR会将成功破解的密码保存在一个名为
john.pot
(POT代表Potentially Cracked Passwords) 的文件中,该文件位于JtR的运行目录或用户的主目录下。 - 你可以使用
john --show <hash_file>
命令来显示已破解的密码。
- JtR会将成功破解的密码保存在一个名为
4. JtR 的主要破解模式
JtR的强大之处在于其灵活的破解模式。以下是几种最主要的模式:
- 单一破解模式 (Single Crack Mode /
-single
):- 这是JtR默认会尝试的模式之一,速度非常快。
- 它会利用哈希文件中提供的额外信息(如用户名、GECOS字段中的全名、家目录等)来生成候选密码。
- 例如,如果用户是
jsmith
,JtR会尝试jsmith
,smith
,john
,j0hn
等变体。 - 它还会应用一些常见的密码变换规则。
- 命令示例:
./john my_hashes.txt -single
(通常JtR会自动尝试此模式,无需显式指定)
- 字典破解模式 (Wordlist Mode /
--wordlist=<file>
):- 这是最常用也是非常有效的破解模式之一。
- 你需要提供一个密码字典文件 (Wordlist),这个文件包含大量可能的密码(每行一个)。互联网上有很多公开的密码字典,你也可以创建自己的字典。
- JtR会逐一尝试字典中的每个词作为密码。
- 规则引擎 (Rules):为了提高字典破解的效率,JtR拥有一个强大的规则引擎 (
--rules
)。这些规则可以对字典中的词进行各种变换,如大小写转换、添加数字或符号、颠倒顺序、组合词语等,从而生成更多候选密码。- 例如,如果字典词是
password
,规则可以生成Password
,password123
,p@$$wOrd
,drowssap
等。
- 例如,如果字典词是
- 命令示例:
./john --wordlist=/path/to/password.lst my_hashes.txt ./john --wordlist=/path/to/password.lst --rules my_hashes.txt
- 增量破解模式 (Incremental Mode /
-i
或--incremental=<type>
):- 这种模式会尝试所有可能的字符组合,类似于暴力破解 (Brute-force Attack),但JtR的增量模式更智能,它会基于字符频率和密码长度进行优化。
- 你可以指定字符集类型 (
<type>
),如All
(所有可打印ASCII字符),Digits
(数字),Alpha
(字母),Alnum
(字母和数字) 等,或者自定义字符集。 - 这种模式通常非常耗时,尤其是对于长而复杂的密码,但如果其他模式失败,它可能是最后的手段。
- 命令示例:
./john -i=Digits my_hashes.txt # 只尝试数字密码 ./john -i=Alnum my_hashes.txt # 尝试字母和数字组合 ./john -i my_hashes.txt # 尝试默认的增量模式
- 外部模式 (External Mode):允许用户通过C语言编写自定义的破解逻辑,非常灵活但需要编程知识。
- 掩码模式 (Mask Mode /
--mask=<mask>
):Jumbo John 支持的一种高级暴力破解模式,允许你定义密码的结构(掩码),例如你知道密码是8位,前4位是小写字母,后4位是数字,可以大大缩小搜索空间。
JtR通常会按一定顺序自动尝试这些模式(Single -> Wordlist (使用默认password.lst
) -> Incremental)。
5. 常用命令与选项
以下是一些JtR常用的命令和选项:
- 基本运行:
JtR会自动检测哈希类型并尝试默认的破解模式。./john my_password_hashes.txt
- 指定哈希格式 (
--format=<type>
):- 如果JtR无法自动识别哈希类型,或者一个哈希文件中有多种类型的哈希,你可以手动指定。
- 例如:
--format=nt
(Windows NTLM哈希),--format=raw-md5
(纯MD5哈希),--format=sha256crypt
(Linux SHA256哈希)。 - 你可以运行
./john --list=formats
查看支持的所有格式。
./john --format=raw-md5 my_md5_hashes.txt
- 显示已破解的密码 (
--show
):
这会从./john --show my_password_hashes.txt
john.pot
文件中读取并显示与my_password_hashes.txt
文件相关的已破解密码。 - 指定会话名称 (
--session=<name>
):- 允许你为破解过程命名一个会话。这对于暂停和恢复长时间的破解任务非常有用。
./john --session=my_session --wordlist=rockyou.txt my_hashes.txt
- 恢复会话 (
--restore=<name>
):- 如果破解过程意外中断(或你手动停止),可以使用此命令恢复。
./john --restore=my_session
- 使用多核心 (
--fork=<N>
):- 利用多CPU核心并行破解,显著提高速度。
./john --fork=4 --wordlist=rockyou.txt my_hashes.txt # 使用4个核心
- 列出支持的格式/子格式/选项等 (
--list=...
):--list=formats
:列出所有支持的哈希格式。--list=rules
:列出当前配置的规则。--list=incremental-modes
:列出可用的增量模式。
6. 获取密码哈希 (简述与提醒)
再次强调,获取密码哈希必须在合法授权的前提下进行。
- Linux:用户密码哈希通常存储在
/etc/shadow
文件中。你需要root权限才能读取它。通常使用unshadow /etc/passwd /etc/shadow > my_hashes.txt
命令将其转换为JtR可直接使用的格式。 - Windows:用户密码哈希(LM哈希 - 已过时但可能存在,NTLM哈希 - 仍在使用)存储在安全账户管理器 (SAM) 数据库中。直接访问SAM文件非常困难,通常需要使用专门的工具(如
pwdump
,fgdump
, Mimikatz等,或通过离线方式从系统备份中提取)来导出哈希。这些操作通常需要管理员权限。 - 应用程序哈希:许多应用程序(如数据库、Web框架、压缩软件)使用自己的方式存储密码哈希。你需要查阅相关文档或使用特定工具来提取这些哈希。
- 例如,一个Web应用的数据库中可能有一个
users
表,其中password
字段存储了用户密码的MD5或SHA256哈希。
- 例如,一个Web应用的数据库中可能有一个
7. 实践案例 (概念性)
让我们通过几个概念性的例子来理解JtR的用法:
- 案例1:破解一个简单的Linux密码哈希文件
linux_hashes.txt
# 假设 linux_hashes.txt 内容类似 (实际格式更复杂): # user1:$1$salt$hashed_password # user2:$6$salt$hashed_password./john linux_hashes.txt # JtR自动检测格式并开始破解# 等待一段时间后,查看结果 ./john --show linux_hashes.txt
- 案例2:破解一个包含纯MD5哈希的文件
md5_list.txt
,使用字典common_passwords.txt
# 假设 md5_list.txt 内容 (每行一个MD5哈希): # 5f4dcc3b5aa765d61d8327deb882cf99 # e10adc3949ba59abbe56e057f20f883e./john --format=raw-md5 --wordlist=common_passwords.txt md5_list.txt# 查看结果 ./john --show --format=raw-md5 md5_list.txt
8. 道德与法律
极其重要:
- 合法授权:使用John the Ripper或任何密码破解工具,必须获得目标系统或数据的明确授权。未经授权的密码破解是非法行为,可能导致严重的法律后果。
- 道德使用:学习和使用这些工具的目的是为了更好地理解安全风险,从而加强防护,而不是用于恶意攻击。
- 密码安全的重要性:通过学习密码破解,我们更能体会到设置强密码的重要性。一个强密码应该足够长,包含大小写字母、数字和特殊符号,并且不容易被猜到。此外,多因素认证 (MFA) 也是保护账户安全的重要手段。
思考题:
- John the Ripper 的“单一破解模式”和“字典破解模式”有什么主要区别?它们各自的优势是什么?
- 为什么在进行字典破解时,使用“规则引擎”可以大大提高破解成功率?
- 如果你忘记了自己Linux系统的登录密码(并且你有物理访问权限和root权限),理论上你可以如何利用John the Ripper来尝试恢复它?(简述思路,并强调前提条件)
- 除了技术层面,使用密码破解工具还需要考虑哪些重要因素?