赞
踩
在去年软件综合实验中益涵老师特意强调了密码的安全性(输入时(主要是怕被偷看,就是用*****显示)和数据库存储时(存储密文,这才是真正的安全性)),所以当时为了有个好绩点提交最后一天把密码存储采用了简单的哈希加密(同时加盐(Salt))处理。
其实MD5码我们很常见,比如之前下载Mysql的时候细心的宝子就会发现下载按钮下面就有一行MD5码:
个人感觉它的作用就是为了判断下载到本地的软件是原始的、未经篡改的文件吧。通过计算本地文件的哈希值,再与官网公开的哈希值对比,如果相同,说明文件下载没问题,否则,说明文件被篡改。哈希算法的目的之一也是为了验证原始数据是否被篡改。(记得美赛的时候队长强调过~)
MD5简介:
MD5 即 Message-Digest Algorithm 5(信息-摘要算法5),用于确保信息传输完整一致。MD5 是输入不定长度信息,输出固定长度 128-bits 的算法。经过程序流程,生成四个32位数据,最后联合起来成为一个 128-bits 散列。
为什么在设定密码的时候要避免一些简单的密码?比较常听说的两种破解办法就是:暴力穷举和彩虹表(一个预先计算好的常用口令和它们的MD5的对照表)攻击。当然为了防止彩虹表攻击也有一个简单的策略便是MD5加盐加密,分为两种,一种随机盐值,和固定盐值,当时我软件综合采用的是随机盐值。
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));
- }
- }
采用两种哈希加密算法得到的值也是不同滴:
这只是一个非常非常简单的例子,后面如果需要还需要进一步学习嗷!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。