哈希算法及加密实现

本文介绍了哈希算法的基本概念、特点和常见类型,如MD5、SHA系列,探讨了哈希碰撞及其避免策略。文章详细展示了如何使用Java实现MD5、SHA-1、SHA-256等加密,并提到加盐策略以增强密码安全性,防止彩虹表攻击。

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


前言

哈希算法被广泛运用在各种途径中,本文章将带你初步认识哈希算法及它的加密的实现操作效果。


一、哈希算法是什么?

哈希算法又称摘要算法(Disgest),一般指SHA家族,它是安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。

哈希算法特点

  • 相同的输入一定得到相同的输出
  • 不同的输入大概率得到不同的输出
    因此,哈希算法的目的是验证原始数据是否被篡改
    我们可以调用java的hashCode方法验证
System.out.println("Hello Java".hashCode());// 387417328
System.out.println("Hello java".hashCode());// 388370640
System.out.println("Hello,bob".hashCode());//-1095500357

哈希碰撞

哈希碰撞是指两个不同的输入得到了相同的输出。
例如:

	String s1 = "通话";
	String s2 = "重地";
	System.out.println(s1.hashCode());// 1179395
	System.out.println(s2.hashCode());// 1179395

哈希碰撞是不能避免的,这是因为输出的字节长度是固定的,但输入的字节长度不固定,有无数种输入,所以哈希算法是把无数的输入集合映射到一个有限的输出集合里,必然会产生碰撞。
既然不能避免碰撞,我们就要想办法降低碰撞的概率,提高哈希算法的安全性,所以一个安全的哈希算法必须满足:

  • 碰撞概率低
  • 不能被预测输出

常用的哈希算法

算法 输出长度(位) 输出长度(字节)
MD5 128bits 16bytes
SHA-1 160bits 20bytes
RipeMD-160 160bits 20bytes
SHA-256 256bits 32bytes
SHA-512 512bits 64bytes

二、哈希算法对密码加密的实现

为什么要对密码加密储存呢?设想如果数据库中直接存入用户的密码,数据库一旦泄露,那用户的信息将暴露无遗。所以将密码加密后存入数据库,将用户密码加密后的信息与存入数据库的信息去比对验证,这样就算数据库泄露,加密后的密码并不能被直接用于登录。

1.MD5加密

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
public class Main {
   
	public static void main(
哈希算法是一种常用的加密算法,可以将输入的任意长度的数据转化成固定长度的哈希值。在C语言中,我们可以通过一些常用的哈希算法实现来进行加密。 一个常用的哈希算法是MD5(Message Digest Algorithm 5)。在C语言中,我们可以使用openssl库中的MD5函数来实现。 首先,我们需要引入openssl头文件并链接openssl库: ``` #include <openssl/md5.h> #include <stdio.h> #include <string.h> #include <stdlib.h> ``` 接下来,我们可以定义一个函数来实现哈希算法加密功能: ``` void md5_encrypt(char* input, char* output) { unsigned char digest[MD5_DIGEST_LENGTH]; MD5((unsigned char*)input, strlen(input), digest); for(int i = 0; i < MD5_DIGEST_LENGTH; i++) { sprintf(&(output[i*2]), "%02x", (unsigned int)digest[i]); } } ``` 在这个函数中,我们首先定义了一个unsigned char类型的数组digest用于存储MD5算法哈希值。然后,我们调用了MD5函数来对输入的input进行哈希算法的运算。最后,我们通过sprintf函数将哈希值转化为16进制的字符串并存储在output中。 我们可以在主函数中调用md5_encrypt函数,并输出结果: ``` int main() { char input[] = "Hello World"; char output[MD5_DIGEST_LENGTH*2+1]; md5_encrypt(input, output); printf("MD5 hash: %s\n", output); return 0; } ``` 运行这段代码,我们将会得到输入"Hello World"的MD5哈希值并输出。 除了MD5,C语言中还有其他的哈希算法实现,比如SHA-1(Secure Hash Algorithm 1),SHA-256等等。实现这些哈希算法的原理和步骤类似,只需要将相应的函数和头文件进行替换即可。 需要注意的是,哈希算法是一种单向加密算法,即无法通过哈希值逆向得到原始数据。因此,哈希算法主要用于验证数据的完整性和唯一性,而不是加密敏感信息。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值