加密:MD5?SHA-256?哈希值?MD5加盐?

本文探讨了使用哈希函数加密密码的重要性,尤其是MD5和SHA-256算法。由于MD5的安全性降低,通常采用加盐方式提高安全性。加盐是通过在密码中加入随机数,使得即使知道哈希值也无法轻易还原原始密码。文中以Java和Python为例,展示了MD5加盐加密和解密的实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MD5算法的原理可简要的叙述为:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。

为什么要用哈希函数来加密密码——哈希函数是单向、不可逆的
哈希函数:把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值

1、如果开发者需要保存密码(比如网站用户的密码),要考虑如何保护这些密码数据,网站用户密码的泄露是一件非常严重的事情,容易引起用户恐慌,所以在安全方面是重中之重,直接将密码以明文写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码。

2、解决的办法是将密码加密后再存储进数据库,比较常用的加密方法是使用哈希函数(Hash Function)。哈希函数的具体定义,网上和相关书籍中有很多,简单地说,它的特性如下:

(1)原始密码经哈希函数计算后得到一个哈希值;

(2)改变原始密码,哈希函数计算出的哈希值也会相应改变;

(3) 同样的密码,哈希值也是相同的;

(4) 哈希函数是单向、不可逆的。也就是说从哈希值,你无法推算出原始的密码是多少;

有了哈希函数,我们就可以将密码的哈希值存储进数据库。用户登录网站的时候,我们可以检验用户输入密码的哈希值是否与数据库中的哈希值相同。由于哈希函数是不可逆的,即使有人打开了数据库,也无法看到用户的密码是多少。

注:但不意味着存储经过哈希函数加密后的密码就是绝对的安全!
    
单向不可逆的理解:比如我知道MD5加盐加密后的密码,但我无法通过加密密码推算你的原始密码长什么样,因为加密后的值原始信息是残缺的。

MD5、sha1、sha256 都是 不同的哈希函数

美国政府以前广泛采用SHA-1算法,在2005年被我国山东大学的王小云教授发现了安全漏洞,所以现在比较常用SHA-1加长的变种,比如SHA-256。

MD5密码数据库的数据量已经非常庞大了,大部分常用密码都可以通过MD5摘要反向查询到密码明文。
所以为了安全,一般会用 MD5加盐。

盐是什么?
对每个用户,系统在保存密码时,会随机生成一个16位的随机数,拼接在用户密码前或后,进行MD5加密,生成摘要。再按规则(可能是插在摘要前,也可能插再摘要第13位后等)插入到摘要,形成48位数字符串——————每个用户的“盐”都不同。

校验密码的过程,是通过用户名,查找对应的加密密码,按规则提取出16位随机数(“盐”),再按照 密码+盐 再MD5加密的方式生成 摘要。再按规则插入16位的盐。 如果得到的产物与用户表密码一致。则用户校验通过。

Java实现

package com.md5.demo;
import java.math.BigInteger;
import java.security.MessageDigest;
imp

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值