论单向加密算法Bcrypt

2023-11-20 22:50
文章标签 加密算法 单向 bcrypt

本文主要是介绍论单向加密算法Bcrypt,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近在学习关于加密算法的知识,经过一天学习也算是有了一点浅浅的收获,随手记一下。

一、加密算法有哪些?

首先,在开始了解加密算法之前只想知道Bcrypt算法是如何加密的,但随着后面不断的搜索,就慢慢冒出了一大堆的加密算法,看的我是眼花缭乱。

接下来就来说说有哪些加密算法。

  • MD5: 为计算机安全领域广泛使用的一种散列函数,用以提供消息完整性的保护,是一种消息摘要算法,它是 不可逆单向 加密算法。

  • RSA:是一种 可逆的非对称 加密算法。是目前最有影响的公钥加密算法,并被普遍认为是目前最优秀的公钥方案之一。

  • Bcrypt:是一种 不可逆的单向 加密算法。相比于MD5,它的加密过程更久,因此也比MD5更安全,通过暴力的破解方式需要很长时间,不易破解。

以上就是主要了解的三种加密算法,这篇文章先对Bcryt算法进行较为详细的说明。

通过上述的定义,可以看到很多(不)可逆、单/双向、(非)对称这类的名词

其实这就是对加密算法的一种分类

单向加密:即我们可以将密码加密成一个密文,这个密文不同于明文,是不会一眼就能看出密码是多少。但是我们不能根据密文推回明文,即就算数据库被人黑了,有了用户密码的密文,也无法根据密文知道用户密码是多少。

双向加密:即比单向加密多了根据密文推出明文,同时又分为 对称 / 非对称加密算法。

对称加密 :即加密后会生成一个密钥,通过这个密钥完成解密和加密过程

非对称加密:非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和 私有密钥(privatekey:简称私钥)。 公钥 与 私钥 是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密 使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

对称加密如下图: 

二、Bcrypt与Hash算法

通过对比学习才能让人印象深刻~

Bcrypt生成的密文是60位的,MD5的是32位的。

哈希算法

  1. 哈希算法往往被设计成生成具有相同长度的文本,而加密算法生成的文本长度与明文本身的长度有关。

  2. 哈希算法是不可逆的,就是不能根据生成的字符串反推到明文。

  3. HASH 算法是一种消息摘要算法,不是一种加密算法,但由于其单向运算,具有一定的不可逆性,成为加密算法中的一个构成部分。

在上面我们说 Bcrypt 是不可逆的单向加密算法,那么又和hash算法的结果有什么区别呢?

自己写的加密算法或者MD5,同一个密码生成的Hash值是一样的,而BCrypt算法每次加密生成的Hash值是不同的。这就是 Bcrypt 的优势,每次生成的hash值都不一样意味着 Bcrypt的安全系数更高。

那么是怎么做到每次都能产生不一样的hash值呢?

是因为Bcrypt算法它每次加密的时候,会随机加盐,而不是固定一种加盐方式。加密算法重点考虑的就是怎么才能确保密文不被轻易破解。而黑客破解常用的几种有:暴力枚举法、字典法、彩虹表法。因为固定的hash算法计算得出的hash是一样的,但是一旦加 salt 和 password 一起取 hash 值,最后得到的密文就是不同的。如果只有一种加 salt 的方式,那就提高其破译的难度,而Bcrypt 每次都会随机 加 salt, 这无疑是让破译的难度更大。

Bcrypt的用法流程

  • 先随机生成salt,再使salt和password进行hash,将生成的密文存入数据库

  • 校验时,将数据库中的密文取出,再从密文中取出salt和 用户输入的密码 进行hash,得到的hash值和数据库中的进行对比,若相同则密码正确。

BCrypt.checkpw(password, user.getPassword()     // 根据此函数来检验密码是否正确

BCrypt算法是目前使用比较广泛的加密解密算法,SpringSecurity中提供了BCryptPasswordEncoder类。

导入依赖:

<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-config</artifactId>
</dependency>

测试:

public class BcryptTest {public static void main(String[] args) {//用户密码String password = "123456";//密码加密BCryptPasswordEncoder passwordEncoder=new BCryptPasswordEncoder();//加密String newPassword = passwordEncoder.encode(password);System.out.println("加密密码为:"+newPassword);//对比这两个密码是否是同一个密码boolean matches = passwordEncoder.matches(password, newPassword);System.out.println("两个密码一致:"+matches);}
}

参考资料:

常用的加密算法:单向加密和双向加密_技术交流_牛客网

百度百科-验证

BCrypt 密码加密和解密 - 简书

BCrypt算法加密解密_Romona_J的博客-CSDN博客_bcrypt解密

算法高级(22)-BCrypt加密算法,号称目前最安全的算法之一_十步杀一人_千里不留行的博客-CSDN博客_已知安全的加密算法

MD5算法如何被破解_HelloWorld搬运工的博客-CSDN博客_md5差分攻击

常用的加密算法 - 简书

这篇关于论单向加密算法Bcrypt的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/398022

相关文章

win10系统下openssl证书生成和单向认证

文章目录 前言一、安装openssl二、创建证书目录和必要文件1、创建sslcertTest文件夹2、创建openssl.cnf文件3、创建必要文件 三、创建密钥和证书1、创建根证书私钥ca.key2、创建根证书请求文件ca.csr3、创建自签根证书ca.crt4、创建服务端私钥server.key5、创建服务端证书请求文件server.csr6、创建自签服务端证书server.crt 四、

AES加密算法说明

首先,我们得了解AES加密算法的一些基本概念。AES是一种对称加密算法,所谓对称,是说它的加密、解密过程使用相同的密钥。还有非对称加密算法,例如RSA,加密解密使用的是公私钥对。 AES同时是一种分组加密算法,分组的长度一般是16字节(128bit)。分组是什么意思呢?假设我有一段很长的明文T,我没法用AES加密整个T,只能将T分成若干16byte的明文组,接着对这些明文组逐个进行加密,得到一堆密

Java-单向链表实现

什么是链表?         链表是一种常见的数据结构,用于存储一系列元素。与数组不同,链表中的元素(节点)在内存中不必是连续的。每个节点包含数据部分和指向下一个节点的引用(指针)。链表的主要优点是插入和删除操作的时间复杂度为O(1),但访问特定元素的时间复杂度为O(n)。 头节点         在单链表的数据结构中,头节点并不是一个独立的节点,而是一个指针或引用,指向链表中第一个数据节点

linux下c语言中的单向列表,双向链表,内核双向列表,及适用场景

1. 单向链表(Singly Linked List) 1.1 定义与结构 单向链表是链式存储结构中最简单的一种。它的每个节点包含两个部分: - 数据域:存储数据元素 - 指针域:存储指向下一个节点的指针 在单向链表中,节点通过指针域相互链接,形成一个线性结构。链表的最后一个节点指向 `NULL`,表示链表的结束。 C 语言中单向链表的定义: struct Node {     int da

单向链表基础

单向升序链表的创建,结点插入,删除,逆转,合并 #include <iostream>#include <cstdio>using namespace std;template <typename Type>class Listline{public:typedef struct NODE{NODE(){next = NULL;}Type val;NODE *next;}Node;L

使用C语言对单向链表的操作

<span style="font-size:24px;">//以下所有代码都经过实际上机测试,如果有不合适的地方,请指正,谢谢</span> <span style="font-size:24px;"></span> <span style="font-size:24px;">#include <stdio.h>#include <stdlib.h>#include <mem.h>

单向链表与双向链表

当使用单向链表查看链表中某个节点的数据,可以使用快慢指针法 快慢指针: 快慢指针是一种在链表和数组中常用的算法技巧,主要用于解决链表或数组中的问题,如检测环 存在、找到环的入口、计算链表的中点等。快慢指针的核心思想是使用两个指针以不同的速度遍 链表或数组: >慢指针(Slow Pointer):每次移动一步。 >快指针(Fast Pointer):每次移动两步。 使用场景 检测链表

【SM系列】简单说说SM2,SM3,SM4加密算法

希望文章能给到你启发和灵感~ 如果觉得文章对你有帮助的话,点赞 + 关注+ 收藏 支持一下博主吧~ 阅读指南 开篇说明一、基础环境说明1.1 硬件环境1.2 软件环境 二、什么是SM2加密?2.1 应用场景2.2 与RSA算法的区别 三、什么是SM3加密?3.1 应用场景 四、什么是SM4加密?4.1 应用场景 五、最后 开篇说明 之前我们说过了几种常见加密算法,今天我

光盘安全隔离与信息单向导入系统-信刻

信刻从用户需求出发,为更多用户提供安全可靠的跨网数据单向导入/导出光盘摆渡系统解决方案,解决内外网数据交换的问题,确保数据交换过程的安全性。 公司所研发出的光盘安全隔离与信息单向导入系统依托软硬件相结合的技术,集策略摆渡、加密及杀毒、安全策略、安全审计、日志管理等功能于一体,采用智能机械手模拟人手工操作光盘方式,实现了在完全物理隔离条件下的光盘安全隔离与信息单向导入,确保自动导入数据的安全性。

数据结构,单向链表

数据结构是计算机科学中的一个核心概念,它研究的是数据的组织、管理和存储方式,以及在这些数据上进行操作时的算法。数据结构为数据的高效访问和修改提供了基础。 数组(Array):一种线性数据结构,可以存储固定大小的相同类型的元素,支持通过索引快速访问。 链表(Linked List):由一系列节点组成,每个节点包含数据部分和指向下一个节点的指针。链表可以是单向的或双向的。 栈(Stack):遵