小知识随手记:MD5加密与SHA-1加密

简介: 小知识随手记:MD5加密与SHA-1加密

        在去年软件综合实验中益涵老师特意强调了密码的安全性(输入时(主要是怕被偷看,就是用*****显示)和数据库存储时(存储密文,这才是真正的安全性)),所以当时为了有个好绩点提交最后一天把密码存储采用了简单的哈希加密(同时加盐(Salt))处理。

image.gif

       其实MD5码我们很常见,比如之前下载Mysql的时候细心的宝子就会发现下载按钮下面就有一行MD5码:

image.gif       个人感觉它的作用就是为了判断下载到本地的软件是原始的、未经篡改的文件吧。通过计算本地文件的哈希值,再与官网公开的哈希值对比,如果相同,说明文件下载没问题,否则,说明文件被篡改。哈希算法的目的之一也是为了验证原始数据是否被篡改。(记得美赛的时候队长强调过~)

MD5简介:

       MD5 即 Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。MD5 是输入不定长度信息,输出固定长度 128-bits 的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个 128-bits 散列

       为什么在设定密码的时候要避免一些简单的密码?比较常听说的两种破解办法就是:暴力穷举和彩虹表(一个预先计算好的常用口令和它们的MD5的对照表)攻击。当然为了防止彩虹表攻击也有一个简单的策略便是MD5加盐加密,分为两种,一种随机盐值,和固定盐值,当时我软件综合采用的是随机盐值。

image.gif

SHA-1简介:

       SHA-1(Secure Hash Algorithm 1,安全散列算法1)是一种密码散列函数,SHA-1可以生成一个被称为消息摘要的160位(20字节)散列值,散列值通常的呈现形式为40个十六进制数。

散列函数的两个重要特点:

       第一便是确定性:如果根据同一散列函数得到的两个散列值是不相同的,那么这两个散列值的原始输入也是不相同的。第二点就是散列碰撞(collision):散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,但也可能不同。哈希碰撞是指,两个不同的输入得到了相同的输出。碰撞概率的高低关系到哈希算法的安全性。哈希算法的输出长度越长,就越难产生碰撞,也就越安全。

       因为最近在使用IDEA,所以这里用Java做一个简单的代码示例(注释写的很明白了,也方便自己回顾):

/**
 * @author 蓝多多的小仓库
 * @title: myhash
 * @projectName hash
 * @description: ldd_annotation
 * @date 2022/5/5 18:33
 */
import java.math.BigInteger;
import java.security.MessageDigest;
public class myhash {
  public static void main(String[] args) throws Exception {
    // 获取MessageDigest实例
    MessageDigest md = MessageDigest.getInstance("MD5");//哈希算法1:MD5
    MessageDigest md2 = MessageDigest.getInstance("SHA-1");//哈希算法2:SHA-1
    // 调用update(byte[])输入数据
    //getBytes()使用指定的字符集将字符串编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
    md.update("hello_ldd".getBytes("UTF-8"));
    //调用digest()方法获得byte[]数组表示的摘要
    byte[] result = md.digest();
    md2.update("ldd".getBytes("UTF-8"));
    byte[] result2 = md2.digest();
    //如果在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,所以,此时要使用BigInteger类进行操作
    //第一个参数int signum 如果是 1,则代表BigInteger包装的数计算机存储的二进制为正
    System.out.println(new BigInteger(1, result).toString(16));
    System.out.println(new BigInteger(1, result2).toString(16));
  }
}

image.gif

采用两种哈希加密算法得到的值也是不同滴:

image.gif

这只是一个非常非常简单的例子,后面如果需要还需要进一步学习嗷!

相关文章
|
存储 NoSQL 数据库
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
这篇文章讲述了在分布式微服务系统中添加用户注册和登录功能的过程,重点介绍了用户注册时通过远程服务调用第三方服务获取短信验证码、使用Redis进行验证码校验、对密码进行MD5加密后存储到数据库,以及用户登录时的远程服务调用和密码匹配校验的实现细节。
认证服务---整合短信验证码,用户注册和登录 ,密码采用MD5加密存储 【二】
|
存储 安全 算法
用 MD5 加密 WordPress 验证码的完整教程
本文详细介绍了如何使用MD5加密技术增强WordPress验证码的安全性。通过将验证码答案以MD5形式加密并存储在Session中,避免了明文传输可能带来的安全风险。文章从形势分析、MD5算法介绍到实战操作步骤,逐步引导读者实现加密验证流程。同时提供了调试方法,确保修改生效。此教程旨在为网站添加一层安全保障,提升对抗网络攻击的能力。
643 1
|
数据安全/隐私保护 Python
Python中的MD5加密“解密”
Python中的MD5加密“解密”
647 0
|
存储 算法 安全
MD5加密
MD5(Message-Digest Algorithm 5)是一种单向加密算法,将任意长度的数据转换为128位固定长度的散列值,主要用于数据完整性校验和密码存储。其特点包括不可逆运算、高度离散性和相同输入生成一致结果。然而,MD5存在碰撞风险,直接加密密码不安全,需配合“加盐”处理增强安全性。文中提供了未加盐的MD5工具类`MD5Utils`,核心方法`msgToMD5`实现基本加密功能。尽管MD5理论上不可逆,但通过彩虹表等手段可能存在伪破解风险,建议结合多种加密算法提升安全性。
1028 2
|
存储 Java 数据库
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
这篇文章介绍了如何在Java中通过加盐和加密算法(如MD5和SHA)安全地存储密码,并提供了一个密码工具类PasswordUtils和密码编码类PasswordEncoder的实现示例。
607 10
密码专辑:对密码加盐加密,对密码进行md5加密,封装成密码工具类
|
存储 算法 Java
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
这篇文章详细介绍了在Java项目中如何使用MD5算法对用户密码进行加密存储和登录验证,包括加入依赖、编写MD5工具类、注册时的密码加密和登录时的密码验证等步骤,并通过示例代码和数据库存储信息展示了测试效果。
在Java中使用MD5对用户输入密码进行加密存储、同时登录验证。
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
570 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
数据安全/隐私保护 Python
Python中的MD5加密“解密”
Python中的MD5加密“解密”
747 0
|
IDE 开发工具 数据安全/隐私保护
Python编程实现批量md5加密pdf文件
Python编程实现批量md5加密pdf文件
325 0
|
Java C# 数据安全/隐私保护
如何 使 Java、C# md5 加密的值保持一致
如何 使 Java、C# md5 加密的值保持一致
431 0