密码存明文,谁看了都摇头,你的系统中是怎么存密码的?
wxin55 2024-12-25 16:08 7 浏览 0 评论
密码是一个 IT 系统中很敏感、很重要的部分,尤其是早期的系统,往往登录一个系统只要一个账号和密码就可以了。
很多账号被盗都是因为密码泄露了,密码泄露有很多种可能,比如暴力破解、社工破解。
还有一种就是所谓的拖库,也就是数据库数据被攻击者导出了。这样一来,如果系统中的密码存储过于简单,很容易会被破解。而一个系统的密码被拿到后,往往会被攻击者用来尝试登录其他的系统,因为很多人用同一个密码在互联网上冲浪。
早些年就有一些网站被拖库,而数据库中的密码字段竟然是用明文存储,导致大量用户的密码被泄漏。
图片
那密码如此重要,如何存储才能保证密码足够安全呢,即使被拖库也能保证密码不被破解呢?
明文密码打死不能存
首先,明文密码是无论如何都不能入库的,可能只是互联网早期有这样存的。稍微有点经验的开发者也一定清楚,肯定不能存明文密码。
但凡有个安全评测,明文密码这件事也不可能发生。
哈希值和弱哈希加密尽量不用
比明文密码好一点的是存密码的哈希值,或者一些很简单的加密算法,比如MD5、SHA-1。
我记得很早之前自己做系统的时候,不知道从哪儿看来的方法,就是把密码直接用 MD5 加密存储的,因为 MD5 是不可逆的,也就是不能从MD5加密后的结果转换回加密之前的结果,所以当时就想当然的认为这是安全的。
后来,听说 MD5 虽然不可逆,但是破解起来也是相对容易的,比如碰撞攻击和彩虹表攻击,都有可能将 MD5 解密。
而且有很多在线工具提供解密 MD5 的功能。之前接手过一个项目,密码就是用 MD5 加密的,然后我随便找一个密码用一个在线工具,很快就能解密出来,可见一点儿也不安全。
图片
所以,这种弱加密方式也尽量不要用。
密码加盐才是正解
加盐(Salt)是指在密码哈希之前,向密码中添加一个随机生成的字符串。盐值是唯一的,甚至对于相同的密码,每次生成的哈希值也会不同。
图片
如上图所示,将一个随机的盐(salt)和密码进行哈希运算 hash(password+salt),将算出来的结果存到表中,另外将 salt 值也一并存入。
在进行密码验证的时候,取出当前用户的 salt 和 用户输入的密码,通过同样的方式运算hash(password+salt),最后将运算结果和已存储的hash值进行比对,如果一致说明密码正确。
图片
这样一来,即使有人拿到了数据库中存的 salt 和 hash 也不能获取原始密码。什么暴力破解、彩虹表攻击这些手段,在加入了 salt 的情况下,都会变得非常复杂,几乎是无法破解的。
如果更严谨一点儿,可以搞两个salthash(password + salt + otherSalt),这样安全性会更高一些。
其中 salt 有两点需要注意一下:
- 不能太短,最好长一些,破解难度很大很多;
- 不能全局用同一个 salt,每一个密码要有一个随机的salt;
不用密码更安全
存密码就有风险,现在很多系统都不支持使用账号密码方式登录,而是用更加安全的方式。
比如多因素认证(MFA),比如 GitHub 就强制要求使用这种方式,阿里云也提供这种方式。
再比如短信验证码登录,或者使用其他具有公信力的第三方服务登录,比如微信登录、支付宝登录等。
这些方式没有账号密码,比如短信登录,只有知道手机号,并且能够拿到手机验证码才行。即使有人知道了你的账号,但是想拿到你的手机还是很麻烦的吧。
更多资讯,点击全场景直播解决方案-航天云网解决方案
相关推荐
- Java中List 和 Map、Set 的区别(list和set和map)
-
hello,大家好,我是霖仔java集合的大家了解,我再给大家说一下他们的区别,希望能够帮助到大家结构特点:List和Set是存储单列数据的集合,Map是存储键和值这样的双列数据的集合;Lis...
- Java 集合框架全面解析:选对数据结构,提升开发效率
-
上一章我们详细介绍了各种常用的数据结构情况(参考:数据结构复杂度全览:如何选择最优结构?),本文结合关键数据结构,从列表(List)、队列(Queue)、集合(Set)、映射(Map)四个维度,深入解...
- LinkedList竟然比ArrayList慢了1000多倍?(动图+性能评测)
-
数组和链表是程序中常用的两种数据结构,也是面试中常考的面试题之一。然而对于很多人来说,只是模糊的记得二者的区别,可能还记得不一定对,并且每次到了面试的时候,都得把这些的概念拿出来背一遍才行,未免有些麻...
- LinkedList 底层源码深度解析(linkedlist底层数据结构)
-
目录1.引言2.LinkedList概述2.1类继承体系图2.2各个接口作用3.与ArrayList的对比4.底层数据结构5.核心方法源码解析5.1add()方法5.2a...
- List的用法和实例详解——Java进阶知识讲义系列(四)
-
序欢迎来到全网最完整的Java进阶知识系列教程!!!每天定时更新!!!本期是Java进阶知识系列的第四讲,将分享Java常用的数据容器——集合类。集合类也分很多类型,比如:List、Set、Map、Q...
- Rust高效集合操作(rust基本操作)
-
集合的分类Rust的集合类型主要分布在标准库的std::collections模块中,同时也包括语言内置的数组和字符串类型序列容器序列容器维护元素的顺序,适合需要按索引访问或顺序遍历的场景向量(...
- Java八股文:核心知识点梳理(java八股文是啥)
-
一、Java基础1.Java基本数据类型8种基本类型:整型:byte(1),short(2),int(4),long(8)浮点型:float(4),double(8)字符型:char(2)布...
- 为什么我不推荐研发人员使用 LinkedList?
-
在Java集合框架中,LinkedList作为List的实现之一,经常被认为是ArrayList的替代方案。然而,在大多数实际场景下,我们并不推荐使用LinkedList,原因主要集中...
- ArrayList 、 LinkedList、Vector的区别
-
ArrayList、LinkedList、Vector的区别如下:ArrayListLinkedListVector结构动态数组双向链表动态数组是否线程安全否否是效率遍历查找快,插入删除慢插入删除...
- (2020 )Java最新面试笔试题答案解析(一)
-
Java中的集中基本数据类型是什么?各占用多少字节?【数值型】—(整数类型)byte(1字节)short(2字节)int(4字节)long(8字节)拓展:Java中的数据类型除了上面的基本...
- 超简单五步实现Linux虚拟机CentOS 7系统Root密码忘记重置
-
环境:CentOS7.5重置root密码:1.CentOS7虚拟机开机,将鼠标光标移动至虚拟机内。2.在虚拟机中使用键盘上↑和↓键将选择行设置为第一行(背景高亮即为选中),按下键盘上的e,进...
- 吊轨门和推拉门哪个好?北京今朝区别介绍看完不入坑
-
厨房到底使用什么门好?相信这是大多数业主都比较抓狂的事情,其实在装修中材料的选择最终还是要依据空间而定,那么吊轨门和推拉门哪个好呢?下面就跟随北京装修网一起来看看吧!吊轨门与推拉门介绍吊轨门吊轨门的特...
- 〖省钱宝典〗不花冤枉钱,少走弯路!居家中推拉门如何设计?
-
想要空间最大程度的显大?想要充足的光线?又想拥有合理的区域划分?那么推拉门是你绝对不能错过的好选择。推拉门的设计轻盈简洁,绝对是室内每个空间的福音。它不仅可以最大化地节省空间,方便了居室的功能划分和利...
- 吊趟门与推拉门有什么区别?(吊趟门贵还是推拉门贵)
-
吊趟门与推拉门的区别很多人在购买的时候并不清楚,有些客人甚至根本分不清吊趟门和推拉门,今天小编就给大家讲讲吊趟门与推拉门的相关内容,看看吊趟门与推拉门的区别有哪些?1、推拉门采用以门扇下滑轮为主支撑点...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- Java中List 和 Map、Set 的区别(list和set和map)
- Java 集合框架全面解析:选对数据结构,提升开发效率
- LinkedList竟然比ArrayList慢了1000多倍?(动图+性能评测)
- LinkedList 底层源码深度解析(linkedlist底层数据结构)
- List的用法和实例详解——Java进阶知识讲义系列(四)
- Rust高效集合操作(rust基本操作)
- Java八股文:核心知识点梳理(java八股文是啥)
- 面试题:ArrayList和LinkedList有什么区别?
- 为什么我不推荐研发人员使用 LinkedList?
- ArrayList 、 LinkedList、Vector的区别
- 标签列表
-
- hive行转列函数 (63)
- sourcemap文件是什么 (54)
- display none 隐藏后怎么显示 (56)
- 共享锁和排他锁的区别 (51)
- httpservletrequest 获取参数 (64)
- jstl包 (64)
- qsharedmemory (50)
- watch computed (53)
- java中switch (68)
- date.now (55)
- git-bash (56)
- 盒子垂直居中 (68)
- npm是什么命令 (62)
- python中+=代表什么 (70)
- fsimage (51)
- nginx break (61)
- mysql分区表的优缺点 (53)
- centos7切换到图形界面 (55)
- 前端深拷贝 (62)
- kmp模式匹配算法 (57)
- jsjson字符串转json对象 (53)
- jdbc connection (61)
- javascript字符串转换为数字 (54)
- mybatis 使用 (73)
- 安装mysql数据库 (55)