当前位置: 首页 > news >正文

一文读懂如何安全地存储密码

目录

引言

明文存储

基本哈希存储

加盐哈希存储

适应性哈希算法

密码加密存储

小结


引言

密码是最常用的身份验证手段,既简单又高效。密码安全是网络安全的基石,对保护个人和组织信息的安全具有根本性的作用。然而有关密码泄漏的安全问题一再发生,大部分都是因为密码的存储不安全导致的,那么该如何安全地存储密码呢?接下来就详细讲解一下各种密码存储方案以及对应的优缺点,通过各种方案的对比来选择出最佳的方案。

明文存储

明文存储密码是指在数据库或其他存储系统中直接存储用户密码的原始形式,没有进行任何加密或散列处理。这种方式意味着密码以可读形式保存,任何可以访问存储系统的人都能直接看到明文密码。

这种方式在早期的 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 算法解析》。

使用适应性哈希算法存储密码是目前的最佳实践,这些算法专门为密码存储而设计,提供了盐值的自动管理和计算强度的调整能力,以此来抵御各种攻击手段。唯一缺点可能就是兼容性问题了,在一些受限环境中,可能没有对应的实现。使用这种方式时需要注意的一点是要适当配置好工作因子,不然仍然可能受到攻击。

密码加密存储

密码加密存储是指使用加密算法(对称算法或非对称算法)对用户密码进行加密后存储在数据库中或其他存储系统中。与哈希方式不同的是加密是一个可逆的过程,可以通过解密得到原始密码。这通常涉及到一个密钥,只有知道这个密钥的人才能解密密码。

使用对称或非对称加密算法对密码进行加密,然后存储加密后的值。缺陷主要是以下几点:

  1. 密码加密的安全性极大地依赖于密钥的安全性。如果密钥被泄露,所有的密码都将以明文形式泄露。
  2. 存储可逆形式的密码可能会违反某些隐私和安全标准,如 GDPR 或 PCI DSS。
  3. 即使外部攻击者无法访问数据库,公司内部的员工也可能无意中或有意地使用秘钥解密密码,进而泄露密码,增加了内部安全问题发生的风险。

在现代的密码存储实践中,是不推荐使用可逆的加密算法存储的,所以这种方式不推荐使用。

小结

每种密码存储方法都有其优缺点,但最佳实践是使用适应性哈希算法,适应性哈希算法专门为密码存储而设计,提供了盐值的自动管理和计算强度的调整能力,以此来抵御各种攻击手段。

相关文章:

一文读懂如何安全地存储密码

目录 引言 明文存储 基本哈希存储 加盐哈希存储 适应性哈希算法 密码加密存储 小结 引言 密码是最常用的身份验证手段,既简单又高效。密码安全是网络安全的基石,对保护个人和组织信息的安全具有根本性的作用。然而有关密码泄漏的安全问题一再发生…...

【运维面试100问】(六)buffer和cache的区别

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...

创建域名邮箱邮件地址的方法与步骤

如何创建域名邮箱邮件地址?使用Zoho Mail创建域名邮箱邮件地址的步骤简单易懂,操作便捷。从其他邮箱迁移到Zoho Mail的过程也相当顺畅,您可以轻松为所有员工创建具有企业邮箱域名的电子邮件地址。 步骤1:添加并验证您的域名 首先&#xff0c…...

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&#xff1a;视C为一个语言联邦 条款1中提到了将C看作为一个“语言联邦”的概念。具体来说&#xff0c;“语言联邦”是指将C看作由多种不同的子语言组成的联邦。每种子语言都有自己的惯用法、工具和库&#xff0c;可以用来解决特定的问题。因此&#xff0c;…...

ElementUI table+dialog实现一个简单的可编辑的表格

table组件如何实现可编辑呢&#xff1f; 我的需求是把table组件那样的表格&#xff0c;实现它点击可以弹出一个框&#xff0c;然后在这个框里面输入你的东西&#xff0c;然后将他回显回去&#xff0c;当然&#xff0c;输入的有可能是时间啥的。 为什么要弹出弹层不在框上直接…...

Rust语言精讲:数据类型全解析

大家好&#xff01;我是lincyang。 今天&#xff0c;我们将深入探讨Rust语言中的数据类型&#xff0c;这是理解和掌握Rust的基础。 Rust语言数据类型概览 Rust是静态类型语言&#xff0c;所有变量类型在编译时确定。Rust的数据类型分为两类&#xff1a;标量类型和复合类型。…...

《数据结构、算法与应用C++语言描述》-代码实现散列表(线性探查与链式散列)

散列表 完整可编译运行代码&#xff1a;Github:Data-Structures-Algorithms-and-Applications/_22hash/ 定义 字典的另一种表示方法是散列&#xff08;hashing&#xff09;。它用一个散列函数&#xff08;也称哈希函数&#xff09;把字典的数对映射到一个散列表&#xff08…...

Hadoop学习笔记:运行wordcount对文件字符串进行统计案例

文/朱季谦 我最近使用四台Centos虚拟机搭建了一套分布式hadoop环境&#xff0c;简单模拟了线上上的hadoop真实分布式集群&#xff0c;主要用于业余学习大数据相关体系。 其中&#xff0c;一台服务器作为NameNode&#xff0c;一台作为Secondary NameNode&#xff0c;剩下两台当…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

Debian系统简介

目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版&#xff…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...