单向加密算法
- 格式:doc
- 大小:198.00 KB
- 文档页数:11
数字密码法数字密码是密码学中的一个基本概念,用数字来表示任何信息。
数字密码是一种用数字组成的密码,可以比较容易地加密和解密数据。
数字密码分为单向加密和双向加密两种形式。
单向加密单向加密是将明文转换为密文,并且无法将密文还原回明文。
因此,单向加密方法用于存储密码,以保护用户的数据和隐私。
常见的单向加密方法有MD5、SHA-1、SHA-2和BCrypt。
MD5MD5(Message-Digest Algorithm 5)是一种常用的单向加密算法。
它是一种哈希函数,可以将字符串或文件转换为128位的散列值。
MD5散列值通常用于密码校验、数字签名、消息验证等。
MD5算法不是绝对安全的,因为一些黑客已经开发出了破解算法。
为了增强密码的安全性,通常会对密码进行特殊处理,如加盐(加入随机值)和多重哈希(进行多次哈希计算)。
SHASHA(Secure Hash Algorithm)算法是另一种常用的单向加密算法。
与MD5相比,SHA算法提供更高的安全性和更长的哈希值。
SHA-1是SHA家族中最初的版本,其哈希值为160位。
但是,SHA-1已经被认为是不安全的,因为它已经被破解。
因此,更安全的SHA-2系列算法已经被广泛采用。
BCryptBCrypt是一个用于密码哈希的开源库。
它基于Blowfish加密算法,并提供了哈希强度的可配置性,允许在安全级别和哈希计算速度之间进行权衡。
常用的语言都有BCrypt库的实现,如PHP、Python和Ruby等。
双向加密双向加密也被称为对称加密,是一种将明文转换为密文,并将其重新转换为明文的方法。
双向加密只需要一个密码或密钥就可以加密和解密数据。
AESAES(Advanced Encryption Standard)是一种对称加密算法,用于数据加密和解密。
AES通常用于保护敏感信息,如银行和电子商务数据。
AES算法的安全性和可靠性得到了广泛认可,它是美国联邦政府采用的加密标准。
javamd5加密和解密算法实例-回复Javamd5加密和解密算法实例在计算机领域中,数据的安全性是非常重要的。
为了保护数据免受未经授权的访问,数据通常需要进行加密。
MD5是一种常用的加密算法之一,它可以将数据转换为一串固定长度的密文。
在本文中,将详细介绍Java 中的MD5加密和解密算法的实例。
MD5(Message Digest algorithm 5)是一种单向加密算法,它将任意长度的数据块转换为固定长度的密文,通常为128位。
与传统的加密算法不同,MD5无法逆向解密,因此被广泛应用于密码存储和验证等领域。
在Java中,我们可以使用Java.security包中的MessageDigest类实现MD5加密和解密。
首先,我们需要确定要加密的数据,然后创建一个MessageDigest对象并将其初始化为使用MD5算法。
接下来,通过调用update()方法将数据传递给MessageDigest对象,并使用digest()方法获得加密后的结果。
下面是一个使用Java MD5算法加密的示例:javaimport java.security.MessageDigest;import java.security.NoSuchAlgorithmException;public class MD5Example {public static void main(String[] args) {String data = "Hello, World!";String encryptedData = encryptMD5(data);System.out.println("Encrypted data: " + encryptedData);}public static String encryptMD5(String data) {try {MessageDigest md =MessageDigest.getInstance("MD5");md.update(data.getBytes());byte[] encryptedBytes = md.digest();StringBuilder sb = new StringBuilder();for (byte b : encryptedBytes) {sb.append(String.format("02x", b & 0xff));}return sb.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}}在上面的示例中,我们定义了一个名为MD5Example的类,其中包含了一个名为encryptMD5的静态方法。
java中sha256加解密方法SHA256是一种常用的加密算法,它可以对数据进行加密和解密操作。
在Java中,我们可以使用Java的安全库提供的功能来实现SHA256的加解密。
我们需要导入Java的安全库,这可以通过在代码中添加以下语句来实现:```import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;```接下来,我们需要定义一个方法来实现SHA256的加密功能,可以命名为sha256Encrypt。
该方法接受一个字符串作为参数,并返回一个加密后的字符串。
具体代码如下:```public static String sha256Encrypt(String input) {try {MessageDigest digest = MessageDigest.getInstance("SHA-256");byte[] hash = digest.digest(input.getBytes("UTF-8"));StringBuilder hexString = new StringBuilder();for (byte b : hash) {String hex = Integer.toHexString(0xff & b);if (hex.length() == 1) hexString.append('0');hexString.append(hex);}return hexString.toString();} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {e.printStackTrace();}return null;}```在这个方法中,我们首先通过调用MessageDigest.getInstance("SHA-256")来获取SHA-256算法的实例。
Java详解单向加密--MD5、SHA和HMAC及简单实现实例Java 详解单向加密--MD5、SHA和HMAC及简单实现实例概要:MD5、SHA、HMAC这三种加密算法,可谓是⾮可逆加密,就是不可解密的加密⽅法。
MD5MD5即Message-Digest Algorithm 5(信息-摘要算法5),⽤于确保信息传输完整⼀致。
MD5是输⼊不定长度信息,输出固定长度128-bits的算法。
MD5算法具有以下特点:1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进⾏任何改动,哪怕只修改1个字节,所得到的MD5值都有很⼤区别。
4、强抗碰撞:已知原数据和其MD5值,想找到⼀个具有相同MD5值的数据(即伪造数据)是⾮常困难的。
MD5还⼴泛⽤于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多⽅⾯。
如在Unix系统中⽤户的密码是以MD5(或其它类似的算法)经Hash运算后存储在⽂件系统中。
当⽤户登录的时候,系统把⽤户输⼊的密码进⾏MD5 Hash运算,然后再去和保存在⽂件系统中的MD5值进⾏⽐较,进⽽确定输⼊的密码是否正确。
通过这样的步骤,系统在并不知道⽤户密码的明码的情况下就可以确定⽤户登录系统的合法性。
这可以避免⽤户的密码被具有系统管理员权限的⽤户知道。
MD5将任意长度的“字节串”映射为⼀个128bit的⼤整数,并且通过该128bit反推原始字符串是⾮常困难的。
SHASHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应⽤中重要的⼯具,被⼴泛地应⽤于电⼦商务等信息安全领域。
虽然SHA与MD5通过碰撞法都被破解了,但是SHA仍然是公认的安全加密算法,较之MD5更为安全。
SHA所定义的长度下表中的中继散列值(internal state)表⽰对每个数据区块压缩散列过后的中继值(internal hash sum)。
md5加密原理解析现如今,数据的安全性对于个人和组织来说都是至关重要的。
在信息传输和存储过程中,加密的作用不可忽视。
MD5(MD5 Message-Digest Algorithm)是一种常用的加密算法,被广泛应用于数据的摘要、签名等方面。
本文将对MD5加密原理进行详细解析。
一、MD5的概述MD5是一种哈希算法,它能够将不同长度的数据转换成一个128位的长度固定的哈希值。
这个哈希值可以用于数据的完整性校验和密码的存储。
二、MD5的工作原理MD5算法主要包括四个步骤:填充、初始化、计算和输出。
下面将对这四个步骤逐一进行解析。
1. 填充(Padding)在进行MD5加密之前,首先需要对待加密的数据进行填充。
填充的目的是让数据的长度能够满足512位的整数倍,以便后续的处理。
填充的方式是在数据的末尾添加一个bit为1,然后再添加若干个bit为0的位,直到数据的长度满足要求。
2. 初始化(Initialization)初始化是指对MD5算法中的四个32位寄存器进行初始化,这四个寄存器分别为A、B、C、D。
初始时,这四个寄存器的值通过一个预定义的方式设置,而且对于每一次加密过程,这些寄存器的初值都是相同的。
3. 计算(Computation)计算是MD5算法的核心部分,它包括四轮循环处理。
在每一轮中,通过对每一组512位的数据进行操作,更新A、B、C、D四个寄存器的值,最终得到一个128位的哈希值。
这个过程中包括了多次按位运算、位移运算、逻辑函数和模2^32相加等操作。
4. 输出(Output)在计算完成之后,MD5算法将得到一个128位的哈希值。
这个哈希值可以用来作为数据的完整性校验。
通常情况下,MD5算法会将这个哈希值转化为16进制格式进行输出,形式为32个字符。
三、MD5的优缺点1. 优点:(1) 哈希结果的长度固定,不论原始数据长度如何,始终为128位。
(2) 运算速度快,加密效率高。
(3) 相同的数据生成的MD5值是固定的,可以用于数据的校验。
密码学是信息安全领域的重要分支之一,而单向加密是密码学中的一个基础概念。
本文将介绍单向加密的基础原理,重点讨论MD5和SHA-1两种常见的单向加密算法。
1. MD5算法的原理MD5全称为Message Digest Algorithm 5,是一种广泛使用的单向加密算法。
MD5算法以512位分组来处理输入的信息,并产生一个128位的信息摘要。
其基本原理如下:(1)填充对输入的信息进行填充,使其长度满足对512求余的结果为448。
(2)计算将填充后的信息按512位分组进行处理,对每个分组进行一系列的循环操作,得到最终的128位信息摘要。
2. SHA-1算法的原理SHA-1全称为Secure Hash Algorithm 1,是由美国国家安全局(NSA)设计的一种单向加密算法。
SHA-1算法以512位分组来处理输入的信息,并产生一个160位的信息摘要。
其基本原理如下:(1)填充对输入的信息进行填充,使其长度满足对512求余的结果为448。
(2)计算类似MD5算法,SHA-1算法也是对填充后的信息按512位分组进行处理,对每个分组进行一系列的循环操作,得到最终的160位信息摘要。
3. MD5与SHA-1的比较MD5和SHA-1都是广泛使用的单向加密算法,但在安全性上存在一定的差异:(1)碰撞概率MD5算法由于设计上的缺陷,存在较高的碰撞概率,即不同的输入信息可能产生相同的信息摘要。
而SHA-1算法在设计上更加安全,碰撞概率较低。
(2)速度MD5算法相对较快,适合对时间要求较高的场景。
而SHA-1算法虽然较MD5稍慢,但在安全性上更有保障。
4. 安全性分析随着计算能力的提升和密码分析技术的发展,MD5算法的安全性已经受到了一定程度的挑战。
2017年,由Google的研究人员发布了对MD5算法的首次碰撞攻击。
这一事件引起了业界对MD5算法安全性的更多关注。
相比之下,SHA-1算法虽然也存在一些理论攻击,但其碰撞攻击难度要稍高于MD5算法。
md5, ase, rsa原理
MD5、AES和RSA是三种不同的加密算法,它们的原理各不相同。
MD5是一种单向加密算法,其全称为message digest algorithm 5(信息摘要算法)。
它可以将任意长度的数据转换为固定长度的二进制字符串,通常用于生成数据的唯一标识或校验码。
MD5的原理是基于哈希函数的,它
将输入的数据进行一系列的位操作和模运算,得到一个固定长度的输出。
由于哈希函数的特性,输入数据的微小变化都会导致输出的巨大差异,因此MD5算法可以用于检测数据的完整性。
AES是一种对称加密算法,其全称为Advanced Encryption Standard(高级加密标准)。
它可以将任意长度的数据转换为固定长度的密文,并且可以通过相同的密钥进行加密和解密。
AES的原理是基于矩阵运算和代换运算的,它将输入的数据分成固定长度的块,然后对每个块进行多次迭代运算,每次迭代中都使用一个密钥进行加解密操作。
由于AES算法具有高度的对称性
和迭代性,可以保证加密和解密过程的严格对应关系,同时加密速度也很快。
RSA是一种非对称加密算法,其全称为Rivest-Shamir-Adleman。
它可以将任意长度的数据转换为固定长度的密文,并且需要使用一对公钥和私钥进行加密和解密。
RSA的原理是基于数论的,它将原始数据和一个大数相乘得
到一个加密后的数据,然后用私钥进行解密得到原始数据。
由于RSA算法使用的是非对称密钥,因此可以保证数据的机密性和完整性。
总的来说,这三种加密算法各有其特点和应用场景,可以根据具体需求选择合适的算法进行数据加密和安全保护。
对称加密算法:采用单钥密码的加密方法,同一个密钥可以同时用来加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
常用的单向加密算法:1、DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;DES算法把64位的明文输入块变为64位的密文输出块,它所使用的密钥也是64位(实际用到了56位,第8、16、24、32、40、48、56、64位是校验位,使得每个密钥都有奇数个1),其算法主要分为两步:1)初始置换其功能是把输入的64位数据块按位重新组合,并把输出分为L0、R0两部分,每部分各长32位,其置换规则为将输入的第58位换到第一位,第50位换到第2位......依此类推,最后一位是原来的第7位。
L0、R0则是换位输出后的两部分,L0是输出的左32位,R0是右32位,例:设置换前的输入值为D1D2D3......D64,则经过初始置换后的结果为:L0=D58D50......D8;R0=D57D49 (7)2)逆置换经过16次迭代运算后,得到L16、R16,将此作为输入,进行逆置换,逆置换正好是初始置换的逆运算,由此即得到密文输出。
此算法是对称加密算法体系中的代表,在计算机网络系统中广泛使用。
2、3DES(Triple DES):是基于DES,对一块数据用三个不同的密钥进行三次加密,强度更高;3DES(即Triple DES)是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。
是DES的一个更安全的变形。
它以DES为基本模块,通过组合分组方法设计出分组加密算法。
比起最初的DES,3DES更为安全。
该方法使用两个密钥,执行三次DES算法,加密的过程是加密-解密-加密,解密的过程是解密-加密-解密。
3DES加密过程为:C=Ek3(Dk2(Ek1(P)))3DES解密过程为:P=Dk1(EK2(Dk3(C)))采用两个密钥进行三重加密的好处有:①两个密钥合起来有效密钥长度有112bit,可以满足商业应用的需要,若采用总长为168bit的三个密钥,会产生不必要的开销。
三种加密算法的特点和优缺点
对称加密算法:加密和解密使用同一个密钥。
优点:保证了数据的保密性,加密速度快。
缺点:无法有效管理密钥,无法解决密钥交换问题。
常用的对称加密算法有:DES、3DES、AES(包括128、192、256、512位密钥的加密)、Blowfish等。
加密工具:openssl、gpg
公钥加密算法(非对称加密算法):生成一个密钥对(私钥和公钥),加密时用对应的私钥或公钥加密,解密时用对应的公钥或私钥解密。
优点:解决了密钥交换问题,可以实现身份认证(数字签名)和数据加密的功能,以及实现密码交换的功能。
缺点:数据加密速度慢,一般不用于数据加密。
常用的公钥加密算法有:RSA(该算法既可以实现加密又可以实现数字签名)、DSA(该算法不能用于加密和解密,一般用于数字签名和认证)等。
加密工具:openssl、gpg
单向加密算法:提取数据的特征码,雪崩效应、定长输出、不可逆。
优点:定长输出,不可逆,实现检验数据的完整性,主要用于保证数据的完整性。
缺点:无法保证数据的保密性。
常用算法:MD4、MD5、SHA1(SHA192,SHA256,SHA384)、CRC-32(不是一种加密算法,只是一种效验码)等。
加密工具:md5sum、sha1sum、openssl dgst
如:计算某个文件的hash值,可通过命令:md5sum或shalsum 文件名即可,或openssl dgst –md5或-sha1 文件名即可。
hive中md5函数Hive是一种分布式数据处理平台,它基于Hadoop生态系统,用于处理大规模的结构化和半结构化数据集。
Hive使用SQL语言进行数据查询,并在Hadoop分布式文件系统中处理数据。
在Hive中,有许多内置的函数可以帮助用户更方便地处理数据。
其中一个常用的函数是md5函数,本文将对该函数进行介绍。
1. md5函数简介md5函数是一种加密函数,它可以将输入的任意长度的字符串或二进制数据进行加密,并返回一个128位的哈希值。
md5算法是一种单向加密算法,即无法通过哈希值反推出原始文本。
md5函数在数据安全、数字签名等方面具有广泛的应用。
```md5(str|binary)```参数说明:- str:表示一个字符串,可以是任意长度的字符序列。
- binary:表示一个二进制数据,可以是任意长度的二进制序列。
下面是一些md5函数的示例,以说明其用法和效果。
- 示例1:对字符串进行加密```SELECT md5('Hello World') as md5_value;```运行结果:```+--------------------------------+| md5_value |+--------------------------------+| eb4b7c52e1f95b5a8d8bd1e85d0f794d |+--------------------------------+```需要注意的是,在第二个示例中,我们将一个base64编码的字符串(“aGVsbG8gd29ybGQ=”)转换为二进制数据,然后对其进行加密。
md5函数在Hive中可以有多种应用,下面列举一些常见的应用场景。
- 数据加密:通过md5函数将敏感数据进行加密,增强数据的安全性。
- 数据完整性校验:通过md5函数计算数据的哈希值,并将其与预期的哈希值进行比较,可以判断数据是否被篡改。
- 数字签名:在数字签名中,使用md5函数对消息进行哈希处理,然后使用私钥对哈希值进行签名,以保证消息的完整性和不可抵赖性。
md5加密原理MD5是消息摘要算法(Message-DigestAlgorithm)的简称,是一种单向加密算法,是RC4算法的升级版,单向加密的意思是从明文到密文唯一的变换过程,而不能够从密文推导出明文,并且是不可逆的加密算法,目前MD5已经被广泛用于数字签名、安全协议、软件验证等诸多领域。
MD5加密具有以下几个特点:1、输入不固定:MD5加密函数可以处理任意长度的消息,无论输入的消息长度是多少,它都可以被MD5加密函数处理,最终都会得到一个128位的消息摘要值。
2、不可逆:MD5是单向加密函数,无论多长的消息,把它加密后,都只能得出唯一的消息摘要值,而推导出原文则是不可能的。
3、不可篡改:由于MD5把消息加密成一个128位的消息摘要值,它总是固定长度的,也就是说,无论输入的消息多长,把它加密后,都只能得出唯一的一个消息摘要值,任何人都无法根据消息的摘要值还原成原文。
因此,即使攻击者知道部分信息,也无法通过改动部分信息来篡改完整的消息,以及比特位错乱而无法特定原文。
MD5加密可以用来判断文件完整性,而不需要逐字节比较。
MD5通过计算一个文件的MD5值,可以非常快速地对文件进行校验。
只要文件内容没有发生变化,就可以保证MD5值不变,也可以用于判断文件内容是否完整。
MD5加密是经常用在加密和解密中,因为其独特的加密和解密特性,在网上交易中,经常会使用到MD5加密来保证数据的安全性。
MD5可以将任何长度的消息转换为一个128位的数字,多用于数据的完整性校验,是发送者和接收者确认所传送的数据不被变化的一种机制,经过MD5加密之后,可以将原文件转换成哈希值,哈希值是一个固定的值,不管原文件有多长,哈希值大小都是一样。
综上所述,MD5加密虽然不能被完全反推,但对于数据的完整性校验、文件的认证等方面,都能够发挥出它不可篡改、不可逆转的特性,可以安全地确保数据传输的完整性,因此得到了越来越广泛的应用。
SHA加密算法范文SHA(Secure Hash Algorithm,安全散列算法)是一种常见的密码学哈希函数,用于对消息进行加密。
SHA算法主要用于确保数据的完整性和可靠性,是一种单向加密算法,即不可逆的。
SHA算法的原理是将任意长度的输入通过一个压缩算法,生成固定长度的哈希值作为输出。
SHA算法常见的版本有SHA-1、SHA-256、SHA-384和SHA-512等,它们的输出长度分别为160位、256位、384位和512位。
较长的输出长度意味着更高的安全性。
SHA-1是SHA算法中最早和最广泛应用的版本,它的输出长度为160位。
SHA-1基于MD5算法,但相对于MD5有更高的安全性。
然而,由于SHA-1已经被证明存在一定的弱点,如碰撞攻击(collision attack),不推荐在安全性要求较高的场景中使用。
SHA-256是SHA-2(SHA-2家族包括SHA-224、SHA-256、SHA-384和SHA-512)中最常用的版本,它的输出长度为256位。
SHA-256算法通过执行64轮的哈希计算来生成哈希值,对于较常见的输入长度,它提供了很高的安全性。
SHA-384和SHA-512是SHA-2家族中的更高版本,它们分别提供了384位和512位的输出长度,拥有更高的安全性。
这些版本通过执行80轮的哈希计算来生成哈希值,提供了更加均匀和复杂的哈希函数。
使用SHA算法进行加密的步骤大致如下:1.准备要加密的消息,可以是任意长度的数据。
2. 根据所选择的SHA版本,选择相应的初始哈希值。
例如,SHA-256的初始哈希值由8个32位字(word)组成。
3.将消息进行分组处理,每个分组的大小取决于SHA算法的具体要求。
4.对每个分组进行哈希计算,生成一个临时的哈希值。
5.将上一步得到的临时哈希值与下一个分组进行处理,得到新的临时哈希值。
6.循环执行步骤5,直到所有分组都被处理。
7.最后的临时哈希值即为加密后得到的哈希值。
PHP常见的加密算法
⼀:单向加密算法
1、md5($str, bool):默认返回32位,为true返回16位的⼆进制字符;
2、crypt($strl, $salt):$salt为⼲扰串,置于密⽂前⾯,有多种格式;
3、sha1($str, bool):默认返回40位,为true返回20位的源码格式字符;
⼆:双向加密算法
1、urlencode();
2、rawurlencode();
3、base64_encode():转码图⽚等,<img src="data:image/jpeg;base64,xxxx(base64加密后的字符)">,浏览器可直接解码显⽰该图⽚,⽽不必显⽰图⽚地址。
其中urlencode()和rawurlencode()的分析:
⼀:区别在于:
urlencode()将空格转为了'+'号,⽽rawurlencode()将空格转为了%20,这是唯⼀的区别。
⼆:相同点:
都是将-_.之外的所有⾮字母数字字符进⾏了编码,转成了%加两位⼗六进制字符。
单向散列算法、对称算法、⾮对称算法:
单向散列算法:将不同长度的字符转成了相同长度的字符串;
对称算法:加密和解码的密钥相同,加密/解密快;
⾮对称算法:加密使⽤的是⼤家都知道的公钥,⽽解码时只能使⽤只有⾃⼰知道的私钥。
本篇内容简要介绍BASE64、MD5、SHA、HMAC几种加密算法。
BASE64编码算法不算是真正的加密算法。
MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法。
我们通常只把他们作为加密的基础。
单纯的以上三种的加密并不可靠。
BASE64按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。
(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
通过java代码实现如下:Java代码1./**2. * BASE64解密3. *4. * @param key5. * @return6. * @throws Exception7. */8.public static byte[] decryptBASE64(String key) throws Exception{9. return (new BASE64Decoder()).decodeBuffer(key);10.}11.12./**13. * BASE64加密14. *15. * @param key16. * @return17. * @throws Exception18. */19.public static String encryptBASE64(byte[] key) throws Exception{20. return (new BASE64Encoder()).encodeBuffer(key);21.}主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。
密码加密方法
一、密码加密方法
加密技术是采用某种特定的算法把输入的明文信息转换成密文
信息,以保护信息不被未经授权的人知晓和非法使用。
1.单向加密算法
单向加密算法是指把明文输入后,无法通过推导和计算恢复明文的加密算法,如MD5,SHA-1等。
这些算法的特点是一次性加密,不能进行解密操作,只能通过比对加密前后的信息,来判断是否传输的信息是否被篡改。
2.公钥和私钥加密算法
公钥和私钥加密算法采用非对称算法,一个密钥可以加密,另外一个密钥可以解密,如RSA算法。
3.对称加密算法
对称加密算法,是指加密和解密采用相同的密钥,如DES算法。
4.消息认证码
消息认证码是指加密算法和散列函数的结合,主要用于保证消息传输的完整性,如HMAC算法。
5.混淆
混淆是指在加密中引入噪声,使攻击更加复杂,使得攻击者无法进行密码分析,如IDA算法。
二、常用的加密算法
1.SHA家族
SHA家族是一组数字签名算法,它们都是散列函数,可以将任意大小的消息转换成一个固定大小的散列值,常用的SHA算法有SHA-1、SHA-256、SHA-384、SHA-512等。
2.AES算法
AES算法(Advanced Encryption Standard)是一种以对称加密算法,它可以使用128位、192位或256位的密钥对数据进行加密,在安全性和加密效果上都优于其他算法,因此被广泛应用。
3.RSA算法
RSA算法(Rivest-Shamir-Adleman)是一种非对称加密算法,它使用一对“密钥”:一个公开的密钥和一个私有的密钥,可以用公开的密钥加密信息,也可以使用私有的密钥解密信息,它的安全性被广泛认可。
单向加密的应用原理图示什么是单向加密单向加密(One-way Encryption)是一种常用的加密方式,它不同于传统的对称加密和非对称加密,采用的是单向函数,即只能进行加密操作,无法进行解密操作。
单向加密算法对输入的数据进行散列计算,生成固定长度的输出,通常称为消息摘要(Message Digest)或哈希值(Hash Value)。
这种方式不可逆,即无法通过哈希值恢复原始数据,但可以用于验证原始数据的完整性。
单向加密的应用场景单向加密在许多领域中得到广泛应用:1.密码存储:在用户注册过程中,将用户的密码进行单向加密后,将加密后的密码存储在数据库中。
这样即使数据库被攻击者获取,攻击者也无法直接获得用户的密码。
2.数字签名:用于验证数据的完整性和真实性。
发送者对数据进行单向加密,生成哈希值后,将哈希值与数据一起发送给接收者。
接收者通过再次对数据进行加密,并将结果与接收到的哈希值进行对比,以验证数据是否被篡改。
3.信息指纹:单向加密可以将任意长度的数据转变为固定长度的哈希值,这使得它可以被用来标识唯一的数据。
通过对文件或文本进行单向加密后,可以生成唯一的哈希值,用作文件或文本的指纹。
4.防篡改认证:通过对软件、固件或固定配置数据进行单向加密,可以防止数据被篡改。
在系统启动时,将固定配置数据进行单向加密,将哈希值与预置的哈希值进行对比,如果一致,则表示系统没有被篡改。
单向加密的原理示意图下面是单向加密的原理示意图:1.单向加密示意图2.单向加密示意图3.单向加密示意图4.单向加密示意图单向加密的步骤单向加密的过程通常包括以下步骤:1.原始数据的转换:将原始数据按照一定的规则转换为二进制形式,使得能够进行后续的计算。
2.数据分块:将转换后的数据按照固定的长度进行分块处理,以便于处理较大的数据。
3.初始向量的添加:在数据分块中,通常会采用初始向量(Initial Vector)对数据进行初始化,以增加计算结果的随机性。
BCrypt加密Bcrypt是单向Hash加密算法,⽽且经过salt和cost的处理,不可反向破解⽣成明⽂。
使其受rainbow攻击破解的概率⼤⼤降低,同时破解的难度也提升不少。
⼀、BCrypt代码使⽤1public class BCryptTest {2public static void main(String[] args) {3 String pwd = "123456";4 String encodePwd = BCrypt.hashpw(pwd, BCrypt.gensalt()); // 加密5 System.out.println(encodePwd);6 boolean flag = BCrypt.checkpw(pwd, encodePwd); // 校验7 System.out.println(flag);8 }9 }输出:$2a$10$EKXOFOjn2Bve3t45194KkOdzGzywmeRw3yeekVf.YeURs2Z4.IaHitrue⼆、BCrypt加密原理BCrypt有四个变量:1. saltRounds: 正数,代表hash杂凑次数,数值越⾼越安全,默认10次。
2. myPassword: 明⽂密码字符串。
3. salt: 盐,⼀个128bits随机字符串,22字符4. myHash: 经过明⽂密码password和盐salt进⾏hash,个⼈的理解是默认10次下,循环加盐hash10次,得到myHash每次明⽂字符串myPassword过来,就通过10次循环加盐salt加密后得到myHash, 然后拼接BCrypt版本号+salt盐+myHash等到最终的bcrypt 密码,存⼊数据库中。
这样同⼀个密码,每次登录都可以根据⾃省业务需要⽣成不同的myHash, myHash中包含了版本和salt,存⼊数据库。
例如BCrypt密码图解:三、BCrypt解密原理在加密的时候,先随机获取salt,然后跟password进⾏hash。
MD5和Hash
不⽌⼀次有⼈问我与MD5的区别以及如何选择使⽤,今天有⼈问我了,其实这⽅⾯我懂的也不太多,基础的还是了解⼀些的,把我知道的记⼀下吧。
MD5和Hash的区别
⾸先,MD5与hash都是单向加密的算法,可以把⼀些信息进⾏单向加密成固定长度的散列码。
(hash算法即常说的散列算法,也被⼈翻译成哈希)其次,MD5也是hash算法的⼀种,常见的hash算法还有sha1,sha2等
MD5也被称为信息摘要算法,由于其算法复杂不够,容易被暴⼒破解的。
SHA1算法也存在和MD5⼀样的问题。
还有SHA2、SHA256、SHA512等,这些算法的复杂度相对要⾼,但是依然是可被破解的只是破解成本被增加了,但是⼀些常⽤的⽂本信息(⽐如密码)的散列码被⼀些专业⼚端记录下来了,还是容易被破解的,怎么办呢?加个密码盐呗,这样的话暴⼒破解⼏乎是搞不定了,即使搞定了可能也因为过去太久时间⽽变的没有价值
常⽤的密码攻击⽅式
常⽤的密码攻击⽅式有字典攻击、暴⼒破解、查表法、反向查表法、彩虹表等。
暴⼒破解:按照⼀定的顺序⼀个⼀个的去试
字典攻击:把常⽤的密码做成字典,破解时先看字典⾥是否存在,有效加快破解速度
查表法:使⽤⼀个⼤型字典,把每个p和对应的q都记录下来,按q做⼀下索引,直接查找匹配。
彩虹表:对于HASH的传统做法是把H(X)的所有输出穷举,查找H(X[y])H§,得出PX[y]。
⽽彩虹表则是使⽤散列链的⽅式进⾏。
说明:
"散列链"是为了降低传统做法空间要求的技术,想法是定义⼀个衰减函数 R 把散列值变换成另⼀字符串。
通过交替运算H函数和R函数,形成交替的密码和散列值链条。
单向加密算法原创作者: snowolf阅读:203次评论:0条更新时间:2009-05-26 本篇内容简要介绍BASE64、MD5、SHA、HMAC几种加密算法。
BASE64编码算法不算是真正的加密算法。
MD5、SHA、HMAC这三种加密算法,可谓是非可逆加密,就是不可解密的加密方法,我们称之为单向加密算法。
我们通常只把他们作为加密的基础。
单纯的以上三种的加密并不可靠。
BASE64按照RFC2045的定义,Base64被定义为:Base64内容传送编码被设计用来把任意序列的8位字节描述为一种不易被人直接识别的形式。
(The Base64 Content-Transfer-Encoding is designed to represent arbitrary sequences of octets in a form that need not be humanly readable.)常见于邮件、http加密,截取http信息,你就会发现登录操作的用户名、密码字段通过BASE64加密的。
通过java代码实现如下:Java代码1./**2. * BASE64解密3. *4. * @param key5. * @return6. * @throws Exception7. */8.public static byte[] decryptBASE64(String key) throws Exception{9. return (new BASE64Decoder()).decodeBuffer(key);10.}11.12./**13. * BASE64加密14. *15. * @param key16. * @return17. * @throws Exception18. */19.public static String encryptBASE64(byte[] key) throws Exception{20. return (new BASE64Encoder()).encodeBuffer(key);21.}主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。
另,BASE加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。
MD5MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。
校验?不管文件多大,经过MD5后都能生成唯一的MD5值。
好比现在的ISO校验,都是MD5校验。
怎么用?当然是把ISO经过MD5后产生MD5的值。
一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。
就是用来验证文件是否一致的。
通过java代码实现如下:Java代码1./**2. * MD5加密3. *4. * @param data5. * @return6. * @throws Exception7. */8.public static byte[] encryptMD5(byte[] data) throws Exception {9.10. MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);11. md5.update(data);12.13. return md5.digest();14.15.}通常我们不直接使用上述MD5加密。
通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。
SHASHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。
虽然,SHA与MD5通过碰撞法都被破解了,但是SHA仍然是公认的安全加密算法,较之MD5更为安全。
通过java代码实现如下:Java代码1. /**2. * SHA加密3. *4. * @param data5. * @return6. * @throws Exception7. */8. public static byte[] encryptSHA(byte[] data) throws Exception {9.10. MessageDigest sha = MessageDigest.getInstance(KEY_SHA);11. sha.update(data);12.13. return sha.digest();14.15. }16.}HMACHMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash 算法的认证协议。
消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。
使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。
接收方利用与发送方共享的密钥进行鉴别认证等。
通过java代码实现如下:Java代码1./**2. * 初始化HMAC密钥3. *4. * @return5. * @throws Exception6. */7.public static String initMacKey() throws Exception {8. KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);9.10. SecretKey secretKey = keyGenerator.generateKey();11. return encryptBASE64(secretKey.getEncoded());12.}13.14./**15. * HMAC加密16. *17. * @param data18. * @param key19. * @return20. * @throws Exception21. */22.public static byte[] encryptHMAC(byte[] data, String key) throws Exception {23.24. SecretKey secretKey = new SecretKeySpec(decryptBASE64(key),KEY_MAC);25. Mac mac = Mac.getInstance(secretKey.getAlgorithm());26. mac.init(secretKey);27.28. return mac.doFinal(data);29.30.}给出一个完整类,如下:Java代码1.import java.security.MessageDigest;2.3.import javax.crypto.KeyGenerator;4.import javax.crypto.Mac;5.import javax.crypto.SecretKey;6.7.import sun.misc.BASE64Decoder;8.import sun.misc.BASE64Encoder;9.10./**11. * 基础加密组件12. *13. * @author 梁栋14. * @version 1.015. * @since 1.016. */17.public abstract class Coder {18. public static final String KEY_SHA = "SHA";19. public static final String KEY_MD5 = "MD5";20.21. /**22. * MAC算法可选以下多种算法23. *24. * <pre>25. * HmacMD526. * HmacSHA127. * HmacSHA25628. * HmacSHA38429. * HmacSHA51230. * </pre>31. */32. public static final String KEY_MAC = "HmacMD5";33.34. /**35. * BASE64解密36. *37. * @param key38. * @return39. * @throws Exception40. */41. public static byte[] decryptBASE64(String key) throws Exception {42. return (new BASE64Decoder()).decodeBuffer(key);43. }44.45. /**46. * BASE64加密47. *48. * @param key49. * @return50. * @throws Exception51. */52. public static String encryptBASE64(byte[] key) throws Exception {53. return (new BASE64Encoder()).encodeBuffer(key);54. }55.56. /**57. * MD5加密58. *59. * @param data60. * @return61. * @throws Exception62. */63. public static byte[] encryptMD5(byte[] data) throws Exception {64.65. MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);66. md5.update(data);67.68. return md5.digest();69.70. }71.72. /**73. * SHA加密74. *75. * @param data76. * @return77. * @throws Exception78. */79. public static byte[] encryptSHA(byte[] data) throws Exception {80.81. MessageDigest sha = MessageDigest.getInstance(KEY_SHA);82. sha.update(data);83.84. return sha.digest();85.86. }87.88. /**89. * 初始化HMAC密钥90. *91. * @return92. * @throws Exception93. */94. public static String initMacKey() throws Exception {95. KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);96.97. SecretKey secretKey = keyGenerator.generateKey();98. return encryptBASE64(secretKey.getEncoded());99. }100.101. /**102. * HMAC加密103. *104. * @param data105. * @param key106. * @return107. * @throws Exception108. */109. public static byte[] encryptHMAC(byte[] data, String k ey) throws Exception {110.111. SecretKey secretKey = new SecretKeySpec(decryptBAS E64(key), KEY_MAC);112. Mac mac = Mac.getInstance(secretKey.getAlgorithm() );113. mac.init(secretKey);114.115. return mac.doFinal(data);116.117. }118.}再给出一个测试类:Java代码1.import static org.junit.Assert.*;2.3.import org.junit.Test;4.5./**6. *7. * @author 梁栋8. * @version 1.09. * @since 1.010. */11.public class CoderTest {12.13. @Test14. public void test() throws Exception {15. String inputStr = "简单加密";16. System.err.println("原文:\n" + inputStr);17.18. byte[] inputData = inputStr.getBytes();19. String code = Coder.encryptBASE64(inputData);20.21. System.err.println("BASE64加密后:\n" + code);22.23. byte[] output = Coder.decryptBASE64(code);24.25. String outputStr = new String(output);26.27. System.err.println("BASE64解密后:\n" + outputStr);28.29. // 验证BASE64加密解密一致性30. assertEquals(inputStr, outputStr);31.32. // 验证MD5对于同一内容加密是否一致33. assertArrayEquals(Coder.encryptMD5(inputData), Coder34. .encryptMD5(inputData));35.36. // 验证SHA对于同一内容加密是否一致37. assertArrayEquals(Coder.encryptSHA(inputData), Coder38. .encryptSHA(inputData));39.40. String key = Coder.initMacKey();41. System.err.println("Mac密钥:\n" + key);42.43. // 验证HMAC对于同一内容,同一密钥加密是否一致44. assertArrayEquals(Coder.encryptHMAC(inputData, key), Coder.encryptHMAC(45. inputData, key));46.47. BigInteger md5 = new BigInteger(Coder.encryptMD5(inputData));48. System.err.println("MD5:\n" + md5.toString(16));49.50. BigInteger sha = new BigInteger(Coder.encryptSHA(inputData));51. System.err.println("SHA:\n" + sha.toString(32));52.53. BigInteger mac = new BigInteger(Coder.encryptHMAC(inputData, inputStr));54. System.err.println("HMAC:\n" + mac.toString(16));55. }56.}控制台输出:Console代码1.原文:2.简单加密3.BASE64加密后:4.566A5Y2V5Yqg5a+G5.6.BASE64解密后:7.简单加密8.Mac密钥:9.uGxdHC+6ylRDaik++leFtGwiMbuYUJ6mqHWyhSgF4trVkVBBSQvY/a22xU8XT1RUemdCWW155Bke10.pBIpkd7QHg==11.12.MD5:13.-550b4d90349ad4629462113e7934de5614.SHA:15.91k9vo7p400cjkgfhjh0ia9qthsjagfn16.HMAC:17.2287d192387e95694bdbba2fa941009aBASE64的加密解密是双向的,可以求反解。