- 密码学教程
- 密码学 - 首页
- 密码学 - 起源
- 密码学 - 历史
- 密码学 - 原理
- 密码学 - 应用
- 密码学 - 优缺点
- 密码学 - 现代
- 密码学 - 传统密码
- 密码学 - 加密的需求
- 密码学 - 双重强度加密
- 密码系统
- 密码系统
- 密码系统 - 组成部分
- 密码系统攻击
- 密码系统 - 彩虹表攻击
- 密码系统 - 字典攻击
- 密码系统 - 暴力攻击
- 密码系统 - 密码分析技术
- 密码学类型
- 密码系统 - 类型
- 公钥加密
- 现代对称密钥加密
- 密码学哈希函数
- 密钥管理
- 密码系统 - 密钥生成
- 密码系统 - 密钥存储
- 密码系统 - 密钥分发
- 密码系统 - 密钥撤销
- 分组密码
- 密码系统 - 流密码
- 密码学 - 分组密码
- 密码学 - Feistel 分组密码
- 分组密码的工作模式
- 分组密码的工作模式
- 电子密码本 (ECB) 模式
- 密码分组链接 (CBC) 模式
- 密码反馈 (CFB) 模式
- 输出反馈 (OFB) 模式
- 计数器 (CTR) 模式
- 经典密码
- 密码学 - 反向密码
- 密码学 - 凯撒密码
- 密码学 - ROT13 算法
- 密码学 - 置换密码
- 密码学 - 加密置换密码
- 密码学 - 解密置换密码
- 密码学 - 乘法密码
- 密码学 - 仿射密码
- 密码学 - 简单替换密码
- 密码学 - 简单替换密码加密
- 密码学 - 简单替换密码解密
- 密码学 - 维吉尼亚密码
- 密码学 - 维吉尼亚密码的实现
- 现代密码
- Base64 编码和解码
- 密码学 - XOR 加密
- 替换技术
- 密码学 - 单字母替换密码
- 密码学 - 单字母替换密码的破解
- 密码学 - 多字母替换密码
- 密码学 - Playfair 密码
- 密码学 - Hill 密码
- 多字母替换密码
- 密码学 - 一次性密码本密码
- 一次性密码本密码的实现
- 密码学 - 置换技术
- 密码学 - 栅栏密码
- 密码学 - 列置换密码
- 密码学 - 密码隐写术
- 对称算法
- 密码学 - 数据加密
- 密码学 - 加密算法
- 密码学 - 数据加密标准 (DES)
- 密码学 - 三重 DES
- 密码学 - 双重 DES
- 高级加密标准 (AES)
- 密码学 - AES 结构
- 密码学 - AES 变换函数
- 密码学 - 字节替换变换
- 密码学 - 行移位变换
- 密码学 - 列混淆变换
- 密码学 - 轮密钥加变换
- 密码学 - AES 密钥扩展算法
- 密码学 - Blowfish 算法
- 密码学 - SHA 算法
- 密码学 - RC4 算法
- 密码学 - Camellia 加密算法
- 密码学 - ChaCha20 加密算法
- 密码学 - CAST5 加密算法
- 密码学 - SEED 加密算法
- 密码学 - SM4 加密算法
- IDEA - 国际数据加密算法
- 公钥(非对称)密码算法
- 密码学 - RSA 算法
- 密码学 - RSA 加密
- 密码学 - RSA 解密
- 密码学 - 创建 RSA 密钥
- 密码学 - 破解 RSA 密码
- 密码学 - ECDSA 算法
- 密码学 - DSA 算法
- 密码学 - Diffie-Hellman 算法
- 密码学中的数据完整性
- 密码学中的数据完整性
- 消息认证
- 密码学数字签名
- 公钥基础设施 (PKI)
- 哈希
- MD5(消息摘要算法 5)
- SHA-1(安全哈希算法 1)
- SHA-256(安全哈希算法 256 位)
- SHA-512(安全哈希算法 512 位)
- SHA-3(安全哈希算法 3)
- 密码哈希
- Bcrypt 哈希模块
- 现代密码学
- 量子密码学
- 后量子密码学
- 密码协议
- 密码学 - SSL/TLS 协议
- 密码学 - SSH 协议
- 密码学 - IPsec 协议
- 密码学 - PGP 协议
- 图像和文件加密
- 密码学 - 图像
- 密码学 - 文件
- 密码隐写术 - 图像
- 文件加密和解密
- 密码学 - 文件加密
- 密码学 - 文件解密
- 物联网中的密码学
- 物联网安全挑战、威胁和攻击
- 物联网安全的密码技术
- 物联网设备的通信协议
- 常用的密码技术
- 自定义构建密码算法(混合密码)
- 云密码学
- 量子密码学
- 密码学中的图像隐写术
- DNA 密码学
- 密码学中的一次性密码 (OTP) 算法
- 区别
- 密码学 - MD5 与 SHA1 的比较
- 密码学 - RSA 与 DSA 的比较
- 密码学 - RSA 与 Diffie-Hellman 的比较
- 密码学与密码学的比较
- 密码学 - 密码学与密码分析的比较
- 密码学 - 经典与量子的比较
- 密码学与隐写术的比较
- 密码学与加密的比较
- 密码学与网络安全的比较
- 密码学 - 流密码与分组密码的比较
- 密码学 - AES 与 DES 密码的比较
- 密码学 - 对称与非对称的比较
- 密码学有用资源
- 密码学 - 快速指南
- 密码学 - 讨论
密码哈希
如果您正在创建一个需要密码进行用户身份验证的产品,则必须实施一个系统来验证用户的登录详细信息。但是,在数据库中存储未加密的密码存在重大的安全风险。
因此,有一种方法可以保护用户的密码,那就是密码哈希。因此,在本章中,我们将定义密码哈希,讨论其重要性,并展示哈希技术如何帮助现代安全地设计我们的密码。
密码哈希基础
密码哈希使用加密方法将所有数据(例如您的密码)压缩成简短的字符和/或数字字符串。密码哈希有助于阻止攻击者在网站遭到黑客攻击时访问您的登录信息。相反,他们得到的只是您的密码创建的难以理解的加密“哈希”。
md5() 哈希函数被广泛使用,它可以从任何输入生成一个 32 个字符的字符串。以下是一些哈希示例:
- "secret123": 5d7845ac6ee7cfffafc5fe5f35cf666d
- "Helloworld": a165968b0a8084a041aed89bf40d581f
- "mypassword": 34819d7beeabb9260a5c854bc85b3e44
- "password123": 482c811da5d5b4bc6d497ffa98491e38
- "hashingpasswords": 6b408e41b2f7a9944367d2b535a201f8
我们可以从这些例子中学到一些简单的解释:
- 即使对输入进行微小的更改,也会完全改变哈希函数的结果。例如,更改单个字符可以完全改变输出的外观。
- 无论输入长度如何,哈希函数始终产生相同长度的输出。它始终是相同的大小——32 个字符。
- 如果您使用相同的输入和哈希函数,您将始终获得相同的结果。这很重要,因为它显示了该过程的一致性和可靠性。
- 仅知道哈希函数使得仅从输出确定原始输入(例如密码)非常困难。通常,尝试通过查看大量可能性来猜测原始输入比直接尝试找出它更快。
密码哈希的工作原理?
让我们看看密码哈希的实际过程:
- 用户通过浏览网站并填写表单来创建用户名和密码。
- 将哈希函数应用于密码,并将结果存储在数据库中。
- 用户在登录后在网站上重新输入其密码。
- 将之前使用的相同哈希函数应用于输入的密码。
- 服务器将此哈希与为用户保存在数据库中的哈希进行验证。
- 如果两个哈希完全匹配,则允许用户访问。
密码哈希的安全性
鉴于哈希的长度与密码无关,您可能会倾向于使用简短且易于记忆的密码。实际上,您应该做相反的事情。您选择的密码对于保护您的数据至关重要。
一旦网络犯罪分子从网站获取密码哈希,实际的密码破解过程就开始了。此操作是在网络犯罪分子的 PC 上离线进行的。网络犯罪分子使用哈希函数来生成与您的哈希匹配的哈希。
由于这些函数是公开的,密码黑客只需计算常用单词和组合的哈希值。然后,他们将破解的密码与这些字典进行比较。
这些字典不仅包含单词。其中还包括前缀、后缀、用数字替换字母的约定(例如,使用 1 代替 l)以及许多其他内容。这意味着弱密码很容易被破解。
确保强大的密码安全性
为了确保强大的密码安全性,您需要遵循以下一些重要提示:
- 创建长密码,并包含大小写字母、数字和特殊字符的组合。
- 为每个帐户使用不同的密码。
- 不要使用易于访问的个人信息,例如您的姓名、出生日期或常用词。
- 尽可能为您的帐户启用双因素身份验证。
- 定期更改密码,主要是针对电子邮件和银行等敏感帐户。
- 避免将密码存储在易于访问的地方,例如纯文本文件或便签。
- 确保您的设备和软件已更新为最新的安全补丁,以防止攻击者利用已知的漏洞。
密码存储方法
有几种方法可以安全地存储密码:
- 哈希 - 哈希是指使用数学方法将密码转换为固定长度的字符字符串。然后将哈希后的密码保存在数据库中。用户登录时,用户的密码将再次哈希,并与存储的哈希进行比较。常用的哈希算法包括 MD5、SHA-1 和 SHA-256。
- 加盐哈希 − 对于每个密码,在哈希之前都会添加一个唯一的随机值,称为盐。通过使用不同的盐,可以确保两个具有相同密码的用户具有不同的哈希值。加盐哈希可以防止彩虹表攻击,攻击者在彩虹表攻击中会预先计算常用密码的哈希值。
- 密钥派生函数 (KDF) − KDF 的目的是安全地从密码中提取加密密钥。为了减缓暴力破解攻击,它们通常使用加盐和迭代计数等特性。PBKDF2(基于密码的密钥派生函数 2)和 bcrypt 是 KDF 的两个示例。
- 密钥伸展 − 这是重复迭代哈希过程以减慢其速度的做法。由于每次尝试都需要更多的处理能力,因此暴力破解攻击的速度会因此变慢。密钥伸展技术用于 bcrypt、scrypt 和 PBKDF2 等算法。
- 加椒 (Peppering) − 在哈希密码之前,添加一个秘密值(椒)。此方法称为加椒。椒不会存储在数据库中,而是单独存储在哈希密码之外。因为攻击者需要哈希密码和椒才能尝试破解密码,所以这增加了另一层安全保障。
密码哈希算法
密码通常使用多种技术进行安全哈希。以下是一些最常用的算法:
- bcrypt
- scrypt
- Argon2
- PBKDF2
- SHA-256/SHA-3
密码哈希的实现
使用 Python
现在我们将实现用于哈希密码的 Python 代码,我们将使用 Python 的 hashlib 库来生成哈希对象。代码如下:
import hashlib def hash_password(password): # change the password to bytes password_bytes = password.encode('utf-8') # generate a SHA-256 hash object hash_object = hashlib.sha256() # update the hash object with the password bytes hash_object.update(password_bytes) # the hexadecimal representation of the hashed password hashed_password = hash_object.hexdigest() return hashed_password # function execution password = "mysecure@password" hashed_password = hash_password(password) print("Hashed password:", hashed_password)
输出
Hashed password: dc12e653439f07e6b0ee268b5559b45bb99be057dd7edd8756d77ef96b21aaee
使用 Java
在此实现中,我们将使用 Java 的 java.security.MessageDigest 和 java.security.NoSuchAlgorithmException 类。因此,MessageDigest 将用于生成消息摘要实例,而 NoSuchAlgorithmException 类用于在找不到此类算法时抛出异常。代码如下:
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class HashingPassword { public static String hashPassword(String password) throws NoSuchAlgorithmException { // Create a MessageDigest instance MessageDigest digest = MessageDigest.getInstance("SHA-256"); // the bytes of the password byte[] passwordBytes = password.getBytes(); // update the digest with the password bytes digest.update(passwordBytes); // get the hashed bytes byte[] hashedBytes = digest.digest(); // change the hashed bytes to hexadecimal StringBuilder hexString = new StringBuilder(); for (byte hashedByte : hashedBytes) { hexString.append(String.format("%02x", hashedByte)); } return hexString.toString(); } public static void main(String[] args) throws NoSuchAlgorithmException { String password = "mysecure@password"; String hashedPassword = hashPassword(password); System.out.println("Hashed password: " + hashedPassword); } }
输出
Hashed password: dc12e653439f07e6b0ee268b5559b45bb99be057dd7edd8756d77ef96b21aaee