漫话:将密码明文保存在数据库是真的low!

明文密码的风险与安全专家的防范方法 如果这个密码以明文形式存储在银行的数据库中,那么一旦黑客入侵了该数据库,他们将能够轻松获取到Alice的密码。总结起来,明文密码的使用是一个严重的安全隐患,容易导致账户和数据被攻击者盗取或滥用。为了保护个人和机构的数据安全,我们应该采取适当的措施,如使用哈希函数、盐值和单向加密算法来加密密码,并结合其他安全措施,如强制密码复杂度、多因素身份验证、定期更改密码和安全教育培训,以提高密码的安全性和整体数据安全水平。然而,仍然有许多人在使用明文密码,这给账户和数据的安全带来了潜在的风险。 阅读详情

 

作者:漫话编程           公众号来源:漫话编程

我看完觉得非常通俗易懂,给大家分享一下!


某天下午,我正在公司愉快的撸代码,突然来了一个电话。原来是女朋友打来的。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

挂断电话后,我赶紧登录12306改掉了我的密码,还好我各个网站的密码不一样,这样就能很好的避免被撞库了。

下班后,回到家中,女朋友第一时间过来找我,一定要我给他解释一下12306的数据泄露背后的知识。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

明文密码

明文密码就是直接可以看懂的,比如123456,admin等等,而不是经过加密显示出****的内容,这种叫做暗码。比如abc代表123,如果告诉你abc而不告诉你解码规则,你就不能翻译出真正的密码123。

很多网站都有注册登录功能,对于用户在注册的时候,填写的用户名和密码,如果不经过任何处理直接保存到数据库中,这种情况下,保存的就是用户的明文密码。

这样直接把用户的明文密码保存下来,对于程序开发来说是很方便的。用户在登录的时候直接到数据库中进行账号密码匹配就可以了。但是,同时也埋下了很大的隐患,一旦数据库信息泄露,那么黑客就可以拿到所有用户的用户名和密码。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

举个例子,比如用户的明文密码是helloworld,加密后的密文是xxeerrqq。

用户注册:

helloworld -> 加密 -> xxeerrqq -> 保存xxeerrqq到数据库中

用户登录

helloworld -> 加密 -> xxeerrqq -> 使用xxeerrqq到数据库中匹配密码

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

密码加密技术经过很多年的发展,已经有了很多成熟的方案,这里就简单介绍几个。

对称加密

对称加密,指的是需要对加密和解密使用相同密钥的加密算法。

最简单的对称加密算法就是通过ASCII码的变化进行密码保存,比如把abcde转换成bcdef,其加密算法就是把ASCII码增加1 。

这种加密算法,有一个特点,就是可以根据加密后得到的密文,再根据密钥还原出明文。

640?wx_fmt=jpeg

 但是,这种算法已经很少有网站在用了,虽然现在有很多方法可以把密钥单独保存,但是,既然黑客可以破解网站拿到用户的密文,就有可能也能获取到密钥。

在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。

单向Hash算法

单向散列算法,又称hash函数,就是把任意长的输入消息串变化成固定长的输出串的一种函数。一般用于产生消息摘要,密钥加密等。

单向Hash算法是一种无法通过计算还原出原始密码,而且实现比较简单的算法。

640?wx_fmt=jpeg

 很多互联网公司都采用这种方式保存用户密码,曾经这种方式也是比较安全的方式。

常见散列函数(Hash函数)有: MD5(Message Digest Algorithm 5)、 SHA(Secure Hash Algorithm)、 MAC(Message Authentication Code)、 CRC(Cyclic Redundancy Check)

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

彩虹表

彩虹表(rainbow table)是一个用于加密散列函数逆运算的预先计算好的表,常用于破解加密过的密码散列。 查找表常常用于包含有限字符固定长度纯文本密码的加密。这是以空间换时间的典型实践,在每一次尝试都计算的暴力破解中使用更少的计算能力和更多的储存空间,但却比简单的每个输入一条散列的翻查表使用更少的储存空间和更多的计算性能。

640?wx_fmt=png

通常情况下,当字段经过散列处理(如MD5),会生成一段散列值,而散列后的值一般是无法通过特定算法得到原始字段的。但是某些情况,比如一个大型的彩虹表,通过在表中搜索该MD5值,很有可能在极短的时间内找到该散列值对应的真实字段内容。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

加盐Hash算法

盐(Salt),在密码学中,是指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。

加盐后的散列值,可以极大的降低由于用户数据被盗而带来的密码泄漏风险,即使通过彩虹表寻找到了散列后的数值所对应的原始内容,但是由于经过了加盐,插入的字符串扰乱了真正的密码,使得获得真实密码的概率大大降低。

640?wx_fmt=jpeg

 对于加了“固定盐”的Hash算法,需要保护“盐”不能泄露,这就会遇到“保护对称密钥”一样的问题,一旦“盐”泄露,根据“盐”重新建立彩虹表可以进行破解。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

PBKDF2算法

PBKDF2算法,即Password-Based Key Derivation Function 2。PBKDF2简单而言就是将加盐Hash进行多次重复计算,这个次数是可选择的。

该算法原理大致相当于在Hash算法基础上增加随机盐,并进行多次Hash运算,随机盐使得彩虹表的建表难度大幅增加,而多次Hash也使得建表和破解的难度都大幅增加。

如果计算一次所需要的时间是1微秒,那么计算1百万次就需要1秒钟。假如攻击一个密码所需的彩虹表有1千万条,建立所对应的彩虹表所需要的时间就是115天。这个代价足以让大部分的攻击者忘而生畏。

640?wx_fmt=jpeg

美国政府机构已经将这个方法标准化,并且用于一些政府和军方的系统。 这个方案最大的优点是标准化,实现容易同时采用了久经考验的SHA算法。

还有很多算法也可以有效抵御彩虹表,常见的有bcrypt、scrypt等。

640?wx_fmt=jpeg

640?wx_fmt=jpeg

bcrypt

bcrypt是专门为密码存储而设计的算法,基于Blowfish加密算法变形而来,由Niels Provos和David Mazières发表于1999年的USENIX。

实现中bcrypt会使用一个加盐的流程以防御彩虹表攻击,同时bcrypt还是适应性函数,它可以借由增加迭代之次数来抵御日益增进的计算机运算能力透过暴力法破解。

由bcrypt加密的文件可在所有支持的操作系统和处理器上进行转移。它的口令必须是8至56个字符,并将在内部被转化为448位的密钥。然而,所提供的所有字符都具有十分重要的意义。密码越强大,您的数据就越安全。

bcrypt经过了很多安全专家的仔细分析,使用在以安全著称的OpenBSD中,一般认为它比PBKDF2更能承受随着计算能力加强而带来的风险。bcrypt也有广泛的函数库支持,因此建议使用这种方式存储密码。

Java中使用bcrypt

可以在官网(http://www.mindrot.org/projects/jBCrypt/ )获取该算法的源代码。在Java中,可以直接使用以下方式进行加密:

public static void main(String[] args) throws NoSuchAlgorithmException{    String  originalPassword = "漫话编程";    String generatedSecuredPasswordHash = BCrypt.hashpw(originalPassword, BCrypt.gensalt(12));    System.out.println(generatedSecuredPasswordHash);    boolean matched = BCrypt.checkpw(originalPassword, generatedSecuredPasswordHash);    System.out.println(matched);}
    String  originalPassword = "漫话编程";
    String generatedSecuredPasswordHash = BCrypt.hashpw(originalPassword, BCrypt.gensalt(12));
    System.out.println(generatedSecuredPasswordHash);

    boolean matched = BCrypt.checkpw(originalPassword, generatedSecuredPasswordHash);

    System.out.println(matched);

}


scrypt

scrypt是由著名的FreeBSD黑客 Colin Percival为他的备份服务 Tarsnap开发的。

设计时考虑到大规模的客制硬件攻击而刻意设计需要大量内存运算。scrypt需要使用大量内存的原因来自于产生大量伪随机性(英语:pseudorandom)资料作为算法计算的基础。一旦这些资料被产生后,算法将会以伪随机性的顺序读取这些资料产生结果。因此最直接的实做方式将会需要大量内存将这些资料储存在内存内供算法计算。

scrypt不仅计算所需时间长,而且占用的内存也多,使得并行计算多个摘要异常困难,因此利用彩虹表进行暴力攻击更加困难。scrypt没有在生产环境中大规模应用,并且缺乏仔细的审察和广泛的函数库支持。但是,scrypt在算法层面只要没有破绽,它的安全性应该高于PBKDF2和bcrypt。

Java中使用scrypt

有一个Java实现的scrypt工具类库(https://github.com/wg/scrypt )可以直接使用。用法也比较简单:

public static void main(String[] args) {    String originalPassword = "漫话编程";    String generatedSecuredPasswordHash = SCryptUtil.scrypt(originalPassword, 16, 16, 16);    System.out.println(generatedSecuredPasswordHash);    boolean matched = SCryptUtil.check("漫话编程", generatedSecuredPasswordHash);    System.out.println(matched);    matched = SCryptUtil.check("漫画编程", generatedSecuredPasswordHash);    System.out.println(matched);}

    String originalPassword = "漫话编程";

    String generatedSecuredPasswordHash = SCryptUtil.scrypt(originalPassword, 16, 16, 16);
    System.out.println(generatedSecuredPasswordHash);

    boolean matched = SCryptUtil.check("漫话编程", generatedSecuredPasswordHash);
    System.out.println(matched);

    matched = SCryptUtil.check("漫画编程", generatedSecuredPasswordHash);
    System.out.println(matched);
}

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg

最后

乐于输出干货的Java技术公众号:Java3y。200多篇原创技术文章、海量视频资源、精美脑图!

640?wx_fmt=jpeg
帅的人都关注了

推荐阅读:

觉得我的文章写得不错,不妨点一下 好看 并 分享 给朋友!




【上海大学计算机组成原理实验报告】五、机器语言程序实验 机器语言程序实验//理解计算机执行程序的实际过程//学习编制机器语言简单程序的方法//将R1中的数值左移n次送OUT,其中n是R2中的数值。(指令码从10开始)//完成R3=R0×R1,结果送OUT。(指令码从30开始)//建立“中文汇编指令”需要哪些条件?//上海大学计算机组成原理实验报告 阅读详情

相关推荐

西门子1500T系列凸轮同步(CAMIN指令用法)

添加凸轮工艺对象(TO_CAM),也就是凸轮表。开始编程,先写2个轴的使能、回原点与主轴的定位。监控主轴与从轴的位置、速度关系是否满足实验要求。1.添加工艺对象(1个定位轴,1个同步轴)调用CAMIN指令 ,凸轮耦合。主轴为旋转轴且为模数轴。3.调用插补凸轮盘指令。4.仿真、监控、调试。

gyxgyx789的博客 1万+

漫话:如何给女朋友解释为什么12306会用户信息泄露(上)——密码篇

某天下午,我正在公司愉快的撸代码,突然来了一个电话。原来是女朋友打来的。挂断电话后,我赶紧登录12306改掉了我的密码,还好我各个网站的密码不一样,这样就能很好的避免被撞库了。下班后,回到家中,女朋友第一时间过来找我,一定要我给他解释一下12306的数据泄露背后的知识。明文密码明文密码就是直接可以看懂的,比如123456,admin等等,而不是经过加密显示出****的内容,这种叫做暗码。比如abc...

weixin_33971205的博客 388

合泰单片机HT32之keil5开发环境搭建(一)

1. 前言 这两天在准备合泰杯,但是总是感觉无从下手,因为合泰单片机的资料教程什么的非常少,不像stm32那样。而且听说要用合泰单片机的专用IDE,感觉当场被劝退了。后来经过查找资料,发现合泰单片机也有keil5的支持包,也就是说可以从库函数进行开发,不用从寄存器进行开发,但我找了好久,并没有找到教程,后来实在没办法,打算自己动手搭建环境,经过了大概两天的挣扎后,终于成功地搭建好了环境,也成功地点...

weixin_44713763的博客 8670

「密码」这种敏感信息,到底该如何存储?

点击上方“芋道源码”,选择“设为星标”管她前浪,还是后浪?能浪的浪,才是好浪!每天 10:33更新文章,每天掉亿点点头发...源码精品专栏原创 | Java 2021超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析网络应用框架 Netty 源码解析消息中间件 RocketMQ 源码解析数据库中间件 Sharding-JDBC 和 MyCAT 源码解析作业调度中间件 E...

芋艿V 571

逆向解析喜马拉雅新版xm-sign算法:从dws.1.6.8.js到签名生成

本文详细解析了喜马拉雅新版xm-sign算法的逆向破解方法。通过定位核心JS文件dws.1.6.8.js,构建本地Node.js模拟执行环境,并解密关键参数cid与appKey,最终实现签名算法的本地化稳定生成,为数据采集提供可靠解决方案。

weixin_29250403的博客 212

STM32驱动2.8寸TFTLCD屏幕实战:从看懂原理图到点亮第一个像素(基于ILI9341)

本文详细介绍了如何使用STM32驱动2.8寸TFTLCD屏幕(基于ILI9341驱动芯片),从硬件连接到软件配置,包括FSMC接口设置、ILI9341初始化序列、坐标设置及基础绘图函数实现。文章还提供了常见问题排查指南和性能优化技巧,帮助开发者快速解决屏幕不亮等问题,并提升显示性能。

weixin_42665255的博客 267

对优快云明文存放我的密码表示无比的愤怒

RT

huylghost的专栏 374

数字后端实现Innovus教程之手把手教你N种高亮timing path和clock tree方法

数字IC后端设计实现Innovus教程之手把手教你N种高亮timing path和clock tree方法

weixin_37584728的博客 3598

什么叫明文,什么叫密文,为什么不允许在数据库里明文保存密码?

这里是修真院后端小课堂,本篇分析的主题是 【什么叫明文,什么叫密文,为什么不允许在数据库里明文保存密码?】 每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析后端知识/技能,本篇分享的是: 【什么叫明文,什么叫密文,为什么不允许在数据库里明文保存密码?】   大家好,我是IT修真院深圳分院第10期的JAVA学员...

qq_45793102的博客 5598

YOLOv8剪枝实战:基于torch_pruning的模型优化与性能提升指南

本文详细介绍了如何使用torch_pruning工具对YOLOv8模型进行结构化剪枝,以实现模型轻量化与性能提升。通过实战步骤解析,包括环境搭建、依赖图分析、迭代剪枝与微调策略,帮助开发者有效减少模型参数量和计算量,提升在边缘设备上的推理速度,同时保持检测(detect)与分割(segment)任务的精度。

water的专栏 1122

akamai3简单分析

akamai流程的简单分析

记录一些web逆向的过程 916

你的数据库密码还在使用明文存储?来看看这篇吧。

如何使用 SpringBoot 实现盐加密

程序员李民才的博客 2748

Windows 11 安装 uv:手动下载、配置国内源

本教程详细介绍了在 Windows 11 系统下安装并配置 Python 包管理器 uv 的完整流程,包括配置环境变量 PATH、设置清华 PyPI 镜像源,以及创建收据文件以支持未来更新。适用于因网络限制无法通过官方脚本自动安装的用户,操作步骤清晰,配有图文指引,帮助读者高效完成本地部署。

寒水馨 · 轻量级技术文档 · hanshuixin.org 7609

明文加密(密码字符)

/** * 密码加密 * 加密key 过滤重复字符 * 将过滤后的字符串追加为完整的英文字母表 * 输入代价密内容对照字母表映射为加密字母表中的字符替换 * */

多头注意力探索Now 572

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

数据存储加密方案与难点

随着云计算、大数据的快速发展,政府越来越意识到网络、数据安全的重要性。相应的法律法规不断完善,这其中包括《网络安全法》、《网络安全等级保护》、《重要数据出境安全评估指南》、《个人信息安全规范、大数据安全标准白皮书》、《大数据服务安全能力要求》等等。作为数据安全的重要组成部分,数据存储安全是安全的基础之一。本文,将描述数据存储加密的主流方案并进行对比,同时对痛点难点问题进行说明。 1. 数据存储加密的场景方案 要对数据进行有效的存储安全管理,可遵循如下步骤: 步骤1:分析并确定要保护的关键数据

计算机毕业论文源码,学生个人网页制作html源码。贴近用户做网络推广和互联网优化。 1170

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

不懂什么是明文加密?一文带你快速认识加密

点击上方蓝字关注我们1 什么是对称加密与非对称加密?简单地说,使用同一个密钥进行加解密的为对称加密。使用不一样的密钥进行加解密的为非对称加密,非对称加密采用了两个密钥,一般使用公钥进...

IT学习小镇 4214

面试题:密码在数据库中如何保存

简介:数据安全,特别是密码的存储非常的重要,下面文章讲解,如何将密码更加安全的存储到数据库中。

jakelihua 1424

Android Webview明文存储密码风险

测评目的 检测App应用的Webview组件中是否使用明文保存用户名及密码。 危险等级 高 危害 Android的Webview组件中默认打开了提示用户是否保存密码的功能,如果用户选择保存,用户名和密码将被明文存储到该应用目录databases/webview.db中。而本地明文存储的用户名和密码,不仅会被该应用随意浏览,其他恶意程序也可能通过提权或者root的方式访问该应用的webview数据库,从而窃取用户登录过的用户名信息以及密码。 测评结果 存在风险(发现4处) 测评结果...

糖小七_Zz的博客 2105

明文密码加密

用户再执行业务时,常会用到输入密码的操作,为了保证用户信息的安全性,我们通常会在前端代码中就进行一次加密处理,使得在从浏览器传输至服务器的过程中保证信息的安全;除了在前端进行一次加密之外,我们还可以在将用户信息存入数据库,或与数据库中存入时加密过的密码比较时,再进行一次加密,本文说一种比较方便的方法,以MD5加密算法为例//1.获取明文密码 String password = user.getPa...

max_xujw的博客 1541

常见的密码加密方式有哪些?2分钟带你快速了解!

哈喽,大家好呀!这里是码农后端。本篇将带你了解一些常见的密码加密方式。毋庸置疑,密码的安全性对于用户来说是非常重要的,如何保证密码的安全性使其不被破解也是一直以来的一个非常重要的话题。

qq_56999608的博客 8262

关于密码安全

证明原理密码泄露的几种可能密码安全防御严谨明文存储密码单项变换(不能逆向得到明文和防猜解)破解哈希单项变换的方式:彩虹表如何解决彩虹表的安全问题我们可以看到简单的彩虹表是可以通过查询得出的但是存储这些简单彩虹表的数据可能是百亿~万亿的数量级如果加密组合复杂,那么需要存储的数据量更大彩虹表受限于计算和存储能力,那几乎是无法存储了,这样就安全了由此可知,彩虹表只能收录比较简单的密码帮助用户增加复杂度,也就是加盐的解决方案密码,变换次数越多越安全密码不安全示例密码加固示例 定义一个password类, 用于加密

Wang的专栏 1960

还在用明文存储密码吗?快来了解一下加密吧

本文为大家介绍了密码加密存储的MD5算法、Bcrypt算法的优势劣势以及如何实施、原理、适用情况等,以及分析了加密算法对于密码加密存储的利弊,希望对你有帮助~~

weixin_53919192的博客 1682

密码管理中明文密码与空密码的危害与预防

摘要: 明文密码和空密码对用户账户安全构成严重威胁。明文密码存储易遭泄露,导致撞库攻击和隐私侵犯,需通过强哈希算法(如Argon2/bcrypt)加盐存储,并强制HTTPS传输。空密码则使攻击零门槛,需通过强制密码策略(长度、复杂度)和前后端验证杜绝。最佳实践包括多因素认证、定期改密及异常登录监控,确保系统仅验证密码哈希值而不知原始密码。

zqmattack的博客 898

我去,同事居然用明文存储密码!!!

Java技术栈www.javastack.cn优秀的Java技术公众号Oh My God!最近检查代码,发现某个系统登录的逻辑直接用明文查询数据库,然后...

Java技术栈,分享最主流的Java技术 1571
上一篇: 面试前必须要知道的Redis面试题
下一篇: Docker入门为什么可以这么简单?
Java3y
Java3y 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 1万+粉丝 509原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值