一文读懂如何安全地存储密码
目录
引言
明文存储
基本哈希存储
加盐哈希存储
适应性哈希算法
密码加密存储
小结
引言
密码是最常用的身份验证手段,既简单又高效。密码安全是网络安全的基石,对保护个人和组织信息的安全具有根本性的作用。然而有关密码泄漏的安全问题一再发生,大部分都是因为密码的存储不安全导致的,那么该如何安全地存储密码呢?接下来就详细讲解一下各种密码存储方案以及对应的优缺点,通过各种方案的对比来选择出最佳的方案。
明文存储
明文存储密码是指在数据库或其他存储系统中直接存储用户密码的原始形式,没有进行任何加密或散列处理。这种方式意味着密码以可读形式保存,任何可以访问存储系统的人都能直接看到明文密码。
这种方式在早期的 Web 应用里面非常常见,一来是为了实现简单,二来是那个时候安全问题不是特别突出,开发人员没有对应的安全意识。随着安全问题日益增多,开发人员安全意识也日益提高,当下这种方式已经很少见了,但是依然有很多缺乏安全意识的同学还这么干。这种方式的缺点就是极其不安全,主要是以下几个方面:
- 安全性极低:如果数据库遭到未授权访问,攻击者可以立即获取所有用户的密码。不仅危害用户在当前系统中的安全,还威胁用户在其他系统中账户的安全(因为许多用户会在不同的系统中使用同样的密码)。
- 违反合规性:多数现代的数据保护法规和标准,如欧盟的通用数据保护条例(GDPR)和支付卡行业数据安全标准(PCI DSS),都要求对敏感数据进行加密处理,明文存储密码已经违反了这些法规。
- 内部威胁:即使外部攻击者无法访问数据库,公司内部的员工也可能无意或有意地泄露密码,增加了内部安全问题发生的风险。
因为这些缺点,明文存储密码是绝对不能使用的方法。
基本哈希存储
基本哈希存储密码是指使用哈希函数(如 MD5、SHA-1 或 SHA-256)将密码转换成固定长度的字符串存储在数据库或其他存储系统中。哈希函数是单向函数,理论上不能从哈希值逆向推导出原始密码。这种方式虽然比明文存储安全性高一些,但仍然有一些明显的缺点:
- 容易产生哈希碰撞:基本的哈希算法例如 MD5 和 SHA-1,已经被证明存在哈希碰撞的问题,即不同的输入可能产生相同的输出,降低了安全性。
- 易被破解:因为相同的密码总是产生相同的哈希值,使得攻击者可以使用彩虹表(预先计算的哈希值表)来反向查找密码。另外由于基本哈希函数的计算速度很快,攻击者可以在短时间内尝试大量可能的密码,使用暴力攻击或字典攻击方法来找到原始密码。
这种方式最好不要使用。
加盐哈希存储
加盐哈希存储密码是指在对密码散列过程中加入一个额外的随机值(称为“盐”),这个盐是在用户每次注册或更改密码时随机生成的,与密码一起被哈希处理。然后将盐和哈希值一起存储在数据库中或其他存储系统中。当用户尝试登录时,取出这个盐并与用户输入的密码一起哈希,然后比较这个哈希值与存储的哈希值是否匹配。加盐哈希的目的是为了增加密码存储的复杂性和安全性,用于抵御彩虹表攻击。因为即使两个用户使用相同的密码,由于盐的不同,对应的哈希值也会不同。这种方式虽然可以抵抗彩虹表攻击,但如果使用的哈希函数计算速度很快(如 MD5、SHA-1),则依然容易被暴力破解。使用这种方式需要注意以下几点:
- 盐的管理:盐必须独特且随机,同时需要安全地存储。如果盐的生成不够随机或者存储不当,那么安全性就会大打折扣。
- 使用方式:对于每个用户都要使用不同的盐并且在服务器端进行哈希,如使用相同的盐或者在客户端进行哈希,安全性会大大降低。
- 使用强哈希函数:由于弱哈希函数例如 MD5、SHA-1 等已经被证明不够安全,建议至少选择使用 SHA256 算法。
这种方式目前被广泛使用,但是还有更优的方式。
适应性哈希算法
适应性哈希算法是针对密码存储做了特别设计的算法,设计时考虑了计算时间,可以调整计算复杂度,以适应硬件性能的提升,使得即使在计算能力增强的情况下,破解密码的难度也能保持在一个较高的水平。
这类算法比较有代表性的是 bcrypt、scrypt、Argon2 等,其中 bcrypt 是使用最广泛的,关于 bcrypt 的详解可以参考之前的文章 《安全高效又易用的密码哈希神器-bcrypt 算法解析》。
使用适应性哈希算法存储密码是目前的最佳实践,这些算法专门为密码存储而设计,提供了盐值的自动管理和计算强度的调整能力,以此来抵御各种攻击手段。唯一缺点可能就是兼容性问题了,在一些受限环境中,可能没有对应的实现。使用这种方式时需要注意的一点是要适当配置好工作因子,不然仍然可能受到攻击。
密码加密存储
密码加密存储是指使用加密算法(对称算法或非对称算法)对用户密码进行加密后存储在数据库中或其他存储系统中。与哈希方式不同的是加密是一个可逆的过程,可以通过解密得到原始密码。这通常涉及到一个密钥,只有知道这个密钥的人才能解密密码。
使用对称或非对称加密算法对密码进行加密,然后存储加密后的值。缺陷主要是以下几点:
- 密码加密的安全性极大地依赖于密钥的安全性。如果密钥被泄露,所有的密码都将以明文形式泄露。
- 存储可逆形式的密码可能会违反某些隐私和安全标准,如 GDPR 或 PCI DSS。
- 即使外部攻击者无法访问数据库,公司内部的员工也可能无意中或有意地使用秘钥解密密码,进而泄露密码,增加了内部安全问题发生的风险。
在现代的密码存储实践中,是不推荐使用可逆的加密算法存储的,所以这种方式不推荐使用。
小结
每种密码存储方法都有其优缺点,但最佳实践是使用适应性哈希算法,适应性哈希算法专门为密码存储而设计,提供了盐值的自动管理和计算强度的调整能力,以此来抵御各种攻击手段。
相关文章:
一文读懂如何安全地存储密码
目录 引言 明文存储 基本哈希存储 加盐哈希存储 适应性哈希算法 密码加密存储 小结 引言 密码是最常用的身份验证手段,既简单又高效。密码安全是网络安全的基石,对保护个人和组织信息的安全具有根本性的作用。然而有关密码泄漏的安全问题一再发生…...
【运维面试100问】(六)buffer和cache的区别
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
创建域名邮箱邮件地址的方法与步骤
如何创建域名邮箱邮件地址?使用Zoho Mail创建域名邮箱邮件地址的步骤简单易懂,操作便捷。从其他邮箱迁移到Zoho Mail的过程也相当顺畅,您可以轻松为所有员工创建具有企业邮箱域名的电子邮件地址。 步骤1:添加并验证您的域名 首先,…...
Qt框架学习(1)
1.安装Qt官网 安装需注意的是,要安装开源版(有钱当我没说),而安装包都是一样的,主要是在注册账户时选择个人开发,而不要选公司,否则在安装时登录账号后会安装商业版Qt. 2.Qt中的快捷键 快捷键解释F4头文件和实现文件切换ShiftF…...
3D电路板在线渲染案例
从概念上讲,这是有道理的,因为PCB印制电路板上的走线从一个连接到下一个连接的路线基本上是平面的。 然而,我们生活在一个 3 维世界中,能够以这种方式可视化电路以及相应的组件,对于设计过程很有帮助。本文将介绍KiCad中基本的3D查看功能,以及如何使用NSDT 3DConvert在线…...
ResizeObserver loop limit exceeded报错解决方案
前言: 控制台没有报错,但是开发Vue项目过程中一直报ResizeObserver loop limit exceeded 错,找到以下解决方式。在main.js文件中重写 ResizeObserver 方法。 main.js文件 (完整版) import { createApp } from "v…...
【OpenCV实现图像:使用OpenCV进行图像处理之透视变换】
文章目录 概要计算公式举个栗子实际应用小结 概要 透视变换(Perspective Transformation)是一种图像处理中常用的变换手段,它用于将图像从一个视角映射到另一个视角,常被称为投影映射。透视变换可以用于矫正图像中的透视畸变&…...
Vue中学习笔记-数据代理
文章目录 前文提要数据代理的概念MVVM模型和Vue中的数据代理M,模型V,视图VM,视图模型 前文提要 本人仅做个人学习记录,如有错误,请多包涵 数据代理的概念 使用一个对象代理对另一个对象中属性的操作。 MVVM模型和Vu…...
IDEA 配置maven结合案例使用篇
1. 项目需求和结构分析 需求案例:搭建一个电商平台项目,该平台包括用户服务、订单服务、通用工具模块等。 项目架构: 用户服务:负责处理用户相关的逻辑,例如用户信息的管理、用户注册、登录等。 spring-context 6.0.…...
基于白鲸算法优化概率神经网络PNN的分类预测 - 附代码
基于白鲸算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于白鲸算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于白鲸优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…...
Android使用Kotlin利用Gson解析多层嵌套Json数据
文章目录 1、依赖2、解析 1、依赖 build.gradle(app)中加入 dependencies { implementation com.google.code.gson:gson:2.8.9 }2、解析 假设这是要解析Json数据 var responseStr "{"code": 200,"message": "操作成功","data&quo…...
DOM事件的传播机制
DOM事件的传播机制是指当一个事件在DOM树中触发时,它是如何在各个元素之间传播的。DOM事件传播机制分为三个阶段:捕获阶段、目标阶段和冒泡阶段。此外,还有一种常用的技术称为事件委托,它能够简化事件处理程序的绑定和管理。本文将…...
gitlab利用CI多工程持续构建
搭建CI的过程中有多个工程的时候,一个完美的构建过程往往是子工程上的更新(push 或者是merge)触发父工程的构建,这就需要如下建立一个downstream pipeline 子仓库1 .gitlab-ci.yml stages:- buildbuild_job:stage: buildtrigger:project: test_user/tes…...
【C++初阶】四、类和对象(构造函数、析构函数、拷贝构造函数、赋值运算符重载函数)
相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 【C初阶】三、类和对象 (面向过程、class类、类的访问限定符和封装、类的实例化、类对象模型、this指针) -CSDN博客 引入:类的六个默认成员函数…...
js粒子效果(二)
效果: 代码: <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Particle Animation</title><…...
01.让自己习惯C++
让自己习惯C 条款1:视C为一个语言联邦 条款1中提到了将C看作为一个“语言联邦”的概念。具体来说,“语言联邦”是指将C看作由多种不同的子语言组成的联邦。每种子语言都有自己的惯用法、工具和库,可以用来解决特定的问题。因此,…...
ElementUI table+dialog实现一个简单的可编辑的表格
table组件如何实现可编辑呢? 我的需求是把table组件那样的表格,实现它点击可以弹出一个框,然后在这个框里面输入你的东西,然后将他回显回去,当然,输入的有可能是时间啥的。 为什么要弹出弹层不在框上直接…...
Rust语言精讲:数据类型全解析
大家好!我是lincyang。 今天,我们将深入探讨Rust语言中的数据类型,这是理解和掌握Rust的基础。 Rust语言数据类型概览 Rust是静态类型语言,所有变量类型在编译时确定。Rust的数据类型分为两类:标量类型和复合类型。…...
《数据结构、算法与应用C++语言描述》-代码实现散列表(线性探查与链式散列)
散列表 完整可编译运行代码:Github:Data-Structures-Algorithms-and-Applications/_22hash/ 定义 字典的另一种表示方法是散列(hashing)。它用一个散列函数(也称哈希函数)把字典的数对映射到一个散列表(…...
Hadoop学习笔记:运行wordcount对文件字符串进行统计案例
文/朱季谦 我最近使用四台Centos虚拟机搭建了一套分布式hadoop环境,简单模拟了线上上的hadoop真实分布式集群,主要用于业余学习大数据相关体系。 其中,一台服务器作为NameNode,一台作为Secondary NameNode,剩下两台当…...
LoongArch五级流水线实战:手把手教你用阻塞技术搞定寄存器写后读冲突(附Verilog代码)
LoongArch五级流水线实战:手把手教你用阻塞技术搞定寄存器写后读冲突(附Verilog代码) 在CPU设计领域,流水线技术是提升处理器性能的关键手段,但随之而来的数据冲突问题也成为了工程师必须面对的挑战。本文将聚焦LoongA…...
Phi-3.5-mini-instruct效果实测:在HellaSwag、MMLU子集上的准确率表现
Phi-3.5-mini-instruct效果实测:在HellaSwag、MMLU子集上的准确率表现 1. 模型简介 Phi-3.5-mini-instruct是一个轻量级的开放模型,属于Phi-3模型家族。它基于高质量的数据集构建,包括合成数据和经过筛选的公开网站数据,特别关注…...
第47篇:AI提示工程高级技巧——思维链、少样本学习与角色扮演(操作教程)
文章目录前言环境准备分步操作技巧一:思维链 (Chain-of-Thought, CoT)技巧二:少样本学习 (Few-Shot Learning)技巧三:角色扮演 (Role Playing)完整代码示例:综合应用踩坑提示总结前言 在AI应用开发中,我们常常遇到这样…...
3dsconv完整教程:5分钟学会3DS游戏格式转换的终极方案
3dsconv完整教程:5分钟学会3DS游戏格式转换的终极方案 【免费下载链接】3dsconv Python script to convert Nintendo 3DS CCI (".cci", ".3ds") files to the CIA format 项目地址: https://gitcode.com/gh_mirrors/3d/3dsconv 3dsconv是…...
告别Token烦恼:PyCharm一键配置Jupyter Notebook与多Conda环境实战
1. 为什么你需要告别Token烦恼? 每次打开Jupyter Notebook都要复制粘贴新Token,这种重复劳动简直让人抓狂。我刚开始用PyCharm连接Jupyter时,每天至少要重复这个动作十几次,直到有一天发现同事的PyCharm居然能自动连接Jupyter&…...
Transformer实战(28)——使用 LoRA 高效微调 FLAN-T5
Transformer实战(28)——使用 LoRA 高效微调 FLAN-T5 0. 前言 1. LoRA 2. SNLI 数据集 3. 使用 LoRA 高效微调 FLAN-T5 3.1 指令格式 3.2 模型选择 4. 使用 QLoRA 进行微调 小结 系列链接 0. 前言 我们已经学习了参数高效微调 (Parameter Efficient Fine-Tuning, PEFT) 的基…...
如何高效限制ACE-Guard进程资源占用:sguard_limit完整使用指南
如何高效限制ACE-Guard进程资源占用:sguard_limit完整使用指南 【免费下载链接】sguard_limit 限制ACE-Guard Client EXE占用系统资源,支持各种腾讯游戏 项目地址: https://gitcode.com/gh_mirrors/sg/sguard_limit 想要在玩腾讯游戏时获得更流畅…...
七旬阿婆半年打赏330万,儿子回家发现连15块电费都交不起
王建国(化名)怎么也没想到,自己援边多年攒下的积蓄,会以这种方式化为乌有。今年4月初,他回到上海家中,发现母亲江阿婆神情恍惚,家里冷清得不像话。问起近况,老人才支支吾吾地说&…...
STM32 AES256加密串口IAP升级Bootloader程序及上位机软件全套资料获取:加...
stm32 AES256加密 串口IAP升级 bootloader程序 通过上位机将keil生成的BIN文件进行AES加密,得到新的加密文件,加密需要自己设置秘钥,加密升级包直接烧录不能运行。 通过串口升级上位机将加密包发送到单片机, 单片机接收到数据后&a…...
企业财务数字化转型:从RPA到AI Agent的落地路径
在企业数字化转型中,财务一直是最优先落地的场景之一。原因很现实:流程标准、数据集中、效果可量化。但也正因为“好做”,很多企业对财务自动化的理解,长期停留在一个比较初级的阶段,随着AI能力的引入,财务…...
