JAVA单向加密算法
java 密码加密解密方法
java 密码加密解密方法在Java中,密码的加密和解密可以通过多种方式实现。
其中,常用的方法包括使用MessageDigest类进行加密,以及使用对称加密和非对称加密算法进行加密和解密。
一种常见的密码加密方法是使用MessageDigest类进行加密。
这可以通过以下步骤实现:首先,将密码转换为字节数组。
然后,使用MessageDigest类的getInstance方法获取特定的加密算法实例,例如SHA-256或MD5。
接下来,使用update方法将密码的字节数组传递给MessageDigest实例。
最后,使用digest方法获得加密后的字节数组,并将其转换为十六进制字符串或其他格式存储在数据库或其他地方。
另一种常见的方法是使用对称加密算法,例如AES或DES。
这些算法使用相同的密钥进行加密和解密。
在Java中,可以使用javax.crypto包中的类来实现对称加密。
通常,需要生成一个密钥并将其存储在安全的地方,然后使用该密钥对密码进行加密和解密。
此外,还可以使用非对称加密算法,例如RSA。
这种方法使用公钥对数据进行加密,然后使用私钥进行解密。
在Java中,可以使用java.security包中的类来实现非对称加密。
无论使用哪种方法,都需要注意密码安全的问题。
例如,密钥的安全存储和管理,以及密码传输过程中的安全性。
另外,还需要考虑密码的哈希加盐等技术来增加密码的安全性。
总之,在Java中实现密码的加密和解密有多种方法,开发人员可以根据实际需求和安全要求选择合适的加密算法和实现方式。
希望这些信息能够帮助你更好地理解Java中密码加密解密的方法。
Java使用Cipher类实现加密,包括DES,DES3,AES和RSA加密
Java使⽤Cipher类实现加密,包括DES,DES3,AES和RSA加密⼀、先看⼀个简单加密,解密实现1.1 加密/*** content: 加密内容* slatKey: 加密的盐,16位字符串* vectorKey: 加密的向量,16位字符串*/public String encrypt(String content, String slatKey, String vectorKey) throws Exception {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKey secretKey = new SecretKeySpec(slatKey.getBytes(), "AES");IvParameterSpec iv = new IvParameterSpec(vectorKey.getBytes());cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);byte[] encrypted = cipher.doFinal(content.getBytes());return Base64.encodeBase64String(encrypted);}1.2 解密/*** content: 解密内容(base64编码格式)* slatKey: 加密时使⽤的盐,16位字符串* vectorKey: 加密时使⽤的向量,16位字符串*/public String decrypt(String base64Content, String slatKey, String vectorKey) throws Exception {Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");SecretKey secretKey = new SecretKeySpec(slatKey.getBytes(), "AES");IvParameterSpec iv = new IvParameterSpec(vectorKey.getBytes());cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);byte[] content = Base64.decodeBase64(base64Content);byte[] encrypted = cipher.doFinal(content);return new String(encrypted);}1.3 代码解释上⾯简单实现了AES("AES/CBC/PKCS5Padding")的加密和解密。
javamd5加密和解密算法实例 -回复
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中的md5用法
java中的md5用法Java中的MD5用法什么是MD5MD5是一种常见的哈希算法,用于对任意长度的数据进行加密。
它可以将任意长度的数据转化为定长的128位(16字节)哈希值。
使用场景MD5主要用于密码存储、数据完整性校验、数字签名等场景。
使用步骤1.导入类:import ;2.创建MD5对象:MessageDigest md = ("MD5");此处也可以使用其他哈希算法,如”SHA-1”等。
3.将要加密的数据转换为字节数组:String data = "Hello, World!";byte[] dataBytes = ();4.将字节数组更新到MD5对象中:(dataBytes);5.计算MD5的哈希值:byte[] md5Bytes = ();6.将MD5的哈希值转化为字符串表示:StringBuilder sb = new StringBuilder();for (byte b : md5Bytes) {(("%02x", b & 0xff));}String md5 = ();通过上述步骤,我们即可得到原始数据的MD5加密结果。
实际应用密码存储在用户注册或登录时,常常需要对用户输入的密码进行加密后才能进行存储或验证。
以下是一个示例代码:public static String getMD5(String data) {String md5 = null;try {MessageDigest md = ("MD5");byte[] dataBytes = ();(dataBytes);byte[] md5Bytes = ();StringBuilder sb = new StringBuilder();for (byte b : md5Bytes) {(("%02x", b & 0xff));}md5 = ();} catch (Exception e) {();}return md5;}在注册时,可以将用户输入的密码使用上述方法加密后存储到数据库中。
java进阶12Base64UrlBase64Hex加密解密技术
java进阶12Base64UrlBase64Hex加密解密技术 java的加密与解密技术: 现在的加密技术主要有 单向加密算法:以MD5 SHA算法为代表 对称加密算法:以DES 三重DES AES PBE算法为代表 ⾮对称加密算法:以RSA为代表 简要的说下这三种加密算法的区别 先是单向加密算法,顾名思义,它不会有密钥,因为它是单向的,加密之后⽆法解密,就连程序猿都⽆法知道加密之后的东西是什么 主要⽤处是数据完整性的验证。
对称加密算法,其特征是公钥与私钥相同。
⼀般⽤来数据储存,⽐如将数据加密之后存⼊数据库,那么数据库管理员就⽆法泄密数据库中的类容 有密钥的⼈却可以根据密钥解密数据库中的真正数据。
⾮对称加密算法,就是公钥与私钥不同,⼀般公钥公开,私钥在你想给⼈看到数据的⼈的⼿上,利⽤私钥来解密数据。
它⼀般是⽤于数据传输的加密。
先由浅⼊深,先说说伪加密 Base64 UrlBase64 Hex ⾸先java api中没有实现这三个类,所以你需要下载jar包。
就是这2个。
先来说说Base64吧。
新建它的类。
package Cipher;import org.bouncycastle.util.encoders.Base64;public class Base64Coder {/** 经Base64编码后的字符串的字符数是以4为单位的整数倍* */public final static String ENCODING="UTF-8";//加密public static String encode(String data) throws Exception{byte[] b=Base64.encode(data.getBytes(ENCODING));//执⾏编码return new String(b,ENCODING);}//解密public static String decode(String data) throws Exception{byte[] b=Base64.decode(data.getBytes(ENCODING));//解密编码return new String(b,ENCODING);}} 然后在主函数中运⾏下。
java中sha256加解密方法
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加密解密算法desededesdiffie-hellman的使用
JAVA加密解密算法DESedeDES,Diffie-Hellman的使用DESede/DES对称算法首先生成密钥,并保存(这里并没的保存的代码,可参考DSA 中的方法)KeyGenerator keygen =KeyGenerator.getInstance(Algorithm);SecretKey deskey = keygen.generateKey();用密钥加密明文(myinfo),生成密文(cipherByte)Cipher c1 = Cipher.getInstance(Algorithm);c1.init(Cipher.ENCRYPT_MODE,deskey);byte[] cipherByte=c1.doFinal(myinfo.getBytes());传送密文和密钥,本文没有相应代码可参考DSA .............用密钥解密密文c1 = Cipher.getInstance(Algorithm);c1.init(Cipher.DECRYPT_MODE,deskey);byte[] clearByte=c1.doFinal(cipherByte);相对来说对称密钥的使用是很简单的,对于JCE来讲支技DES,DESede,Blowfish三种加密术对于密钥的保存各传送可使用对象流或者用二进制编码,相关参考代码如下SecretKey deskey =keygen.generateKey(); byte[]desEncode=deskey.getEncoded();javax.crypto.spec.SecretKeySpec destmp=newjavax.crypto.spec.SecretKeySpec(desEncode,Algorithm); SecretKey mydeskey=destmp;相关APIKeyGenerator 在DSA中已经说明,在添加JCE后在instance进可以如下参数DES,DESede,Blowfish,HmacMD5,HmacSHA1javax.crypto.Cipher 加/解密器public static final Cipher getInstance(ng.String transformation)throws java.security.NoSuchAlgorithmException, NoSuchPaddingException返回一个指定方法的Cipher对象参数:transformation 方法名(可用DES,DESede,Blowfish) public final void init(int opmode, java.security.Key key) throws java.security.InvalidKeyException用指定的密钥和模式初始化Cipher对象参数:opmode 方式(ENCRYPT_MODE, DECRYPT_MODE, WRAP_MODE,UNWRAP_MODE)key 密钥public final byte[] doFinal(byte[] input)throws ng.IllegalStateException, IllegalBlockSizeException,BadPaddingException对input内的串,进行编码处理,返回处理后二进制串,是返回解密文还是加解文由init时的opmode决定注意:本方法的执行前如果有update,是对updat和本次input 全部处理,否则是本inout的内容/*安全程序DESede/DES 测试*/import java.security.*;import javax.crypto.*;public class testdes {public static void main(String[]args){ testdes my=new testdes();my.run(); }public void run() {//添加新安全算法,如果用JCE就要把它添加进去Security.addProvider(newcom.sun.crypto.provider.SunJCE());StringAlgorithm="DES"; //定义加密算法,可用DES,DESede,BlowfishString myinfo="要加密的信息";try { //生成密钥KeyGenerator keygen = KeyGenerator.getInstance(Algorithm); SecretKey deskey = keygen.generateKey(); //加密System.out.println("加密前的二进串:"+byte2hex(myinfo.getBytes())); System.out.println("加密前的信息:"+myinfo); Cipher c1 =Cipher.getInstance(Algorithm);c1.init(Cipher.ENCRYPT_MODE,deskey); byte[] cipherByte=c1.doFinal(myinfo.getBytes());System.out.println("加密后的二进串:"+byte2hex(cipherByte)); //解密c1 =Cipher.getInstance(Algorithm);c1.init(Cipher.DECRYPT_MODE,deskey); byte[] clearByte=c1.doFinal(cipherByte); System.out.println("解密后的二进串:"+byte2hex(clearByte));System.out.println("解密后的信息:"+(newString(clearByte))); } catch(java.security.NoSuchAlgorithmException e1){e1.printStackTrace();} catch(javax.crypto.NoSuchPaddingException e2){e2.printStackTrace();} catch (ng.Exception e3) {e3.printStackTrace();} } public String byte2hex(byte[] b) //二行制转字符串{ String hs=""; String stmp=""; for (int n=0;n2.5. Diffie-Hellman密钥一致协议公开密钥密码体制的奠基人Diffie和Hellman所提出的"指数密钥一致协议"(Exponential Key Agreement Protocol),该协议不要求别的安全性先决条件,允许两名用户在公开媒体上交换信息以生成"一致"的,可以共享的密钥。
Java详解单向加密--MD5、SHA和HMAC及简单实现实例
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)。
java aes gcm加密模式原理
Java AES GCM加密模式原理一、引言在数字信息安全领域,加密技术是一项非常重要的技术,它能够保护数据的隐私性和完整性。
而在加密技术中,AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,它使用相同的密钥进行加密和解密,保证了数据的保密性。
而GCM(Galois/Counter Mode)是一种在AES加密算法基础上增加消息完整性校验的加密模式,它提供了加密和认证功能,同时保护数据不被篡改。
本文将介绍Java语言中AES GCM加密模式的原理及实现方式。
二、AES加密算法简介1. AES算法概述AES是一种对称加密算法,它使用相同的密钥进行加密和解密。
AES算法支持128位、192位和256位的密钥长度,分别对应AES-128、AES-192和AES-256。
在加密过程中,明文通过密钥和AES算法产生密文,而在解密过程中,密文通过密钥和AES算法产生明文。
2. AES加密算法流程(1)密钥扩展:AES算法会将输入的密钥扩展成多个轮密钥,以便对每一轮进行子密钥的应用。
(2)初始轮密钥加:将初始轮密钥与明文进行异或运算。
(3)多轮次的轮函数应用:将初始轮密钥与明文进行多轮次的轮函数应用,每次应用都包括字节替换、行移位、列混淆和轮密钥加。
(4)最终轮函数应用:在最后一轮进行轮函数应用,但不包括列混淆。
(5)密文输出:得到加密后的密文。
三、GCM加密模式简介1. GCM加密模式概述GCM是一种在AES加密算法基础上增加消息完整性校验的加密模式,它提供了加密和认证功能,同时保护数据不被篡改。
GCM加密模式使用一个128位的初始化向量(IV)和一个128位的认证密钥,其中IV 用于加密过程,认证密钥用于认证标签(Tag)的生成。
GCM加密模式不需要进行填充操作,因此更适合对块大小固定的数据进行加密。
2. GCM加密模式流程(1)初始处理:GCM加密模式将IV、认证密钥和明文块作为输入,并进行初始处理,得到初始计数器值。
单向加密
本篇内容简要介绍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两个类,我们只需要知道使用对应的方法即可。
Java 加密解密之消息摘要算法(MD5 SHA MAC)
Java 加密解密之消息摘要算法(MD5 SHA MAC)本文转自网络消息摘要消息摘要(Message Digest)又称为数字摘要(Digital Digest)。
它是一个唯一对应一个消息或文本的固定长度的值,它由一个单向Hash加密函数对消息进行作用而产生。
如果消息在途中改变了,则接收者通过对收到消息的新产生的摘要与原摘要比较,就可知道消息是否被改变了。
因此消息摘要保证了消息的完整性。
消息摘要采用单向Hash 函数将需加密的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。
这样这串摘要便可成为验证明文是否是"真身"的"指纹"了。
HASH函数的抗冲突性使得如果一段明文稍有变化,哪怕只更改该段落的一个字母,通过哈希算法作用后都将产生不同的值。
而HASH算法的单向性使得要找到到哈希值相同的两个不同的输入消息,在计算上是不可能的。
所以数据的哈希值,即消息摘要,可以检验数据的完整性。
哈希函数的这种对不同的输入能够生成不同的值的特性使得无法找到两个具有相同哈希值的输入。
因此,如果两个文档经哈希转换后成为相同的值,就可以肯定它们是同一文档。
所以,当希望有效地比较两个数据块时,就可以比较它们的哈希值。
例如,可以通过比较邮件发送前和发送后的哈希值来验证该邮件在传递时是否修改。
消息摘要算法消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。
消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络相同上使用。
由于其加密计算的工作量相当可观,所以以前的这种算法通常只用于数据量有限的情况下的加密,例如计算机的口令就是用不可逆加密算法加密的。
近年来,随着计算机相同性能的飞速改善,加密速度不再成为限制这种加密技术发展的桎梏,因而消息摘要算法应用的领域不断增加。
Java中常用的加密方式
Java中常⽤的加密⽅式⼀、Java常⽤加密⽅式Base64加密算法(编码⽅式)MD5加密(消息摘要算法,验证信息完整性)对称加密算法⾮对称加密算法数字签名算法数字证书⼆、分类按加密算法是否需要key被分为两类:不基于key的有: Base64算法、MD5基于key的有: 对称加密算法、⾮对称加密算法、数字签名算法、数字证书、HMAC、RC4(对称加密)按加密算法是否可逆被分为两类:单向加密算法(不可解密):MD5、SHA、HMAC⾮单项加密算法(可解密):BASE64、对称加密算法、⾮对称加密算法、数字签名算法、数字证书三、算法介绍1.对称加密对称加密是最快速、最简单的⼀种加密⽅式,加密(encryption)与解密(decryption)⽤的是同样的密钥(secret key)。
对称加密有很多种算法,由于它效率很⾼,所以被⼴泛使⽤在很多加密协议的核⼼当中。
对称加密通常使⽤的是相对较⼩的密钥,⼀般⼩于256 bit。
因为密钥越⼤,加密越强,但加密与解密的过程越慢。
如果你只⽤1 bit来做这个密钥,那⿊客们可以先试着⽤0来解密,不⾏的话就再⽤1解;但如果你的密钥有1 MB⼤,⿊客们可能永远也⽆法破解,但加密和解密的过程要花费很长的时间。
密钥的⼤⼩既要照顾到安全性,也要照顾到效率,是⼀个trade-off。
DES(Data Encryption Standard)和TripleDES是对称加密的两种实现。
DES和TripleDES基本算法⼀致,只是TripleDES算法提供的key位数更多,加密可靠性更⾼。
DES使⽤的密钥key为8字节,初始向量IV也是8字节。
TripleDES使⽤24字节的key,初始向量IV也是8字节。
两种算法都是以8字节为⼀个块进⾏加密,⼀个数据块⼀个数据块的加密,⼀个8字节的明⽂加密后的密⽂也是8字节。
如果明⽂长度不为8字节的整数倍,添加值为0的字节凑满8字节整数倍。
所以加密后的密⽂长度⼀定为8字节的整数倍下⾯举个例⼦:⾮对称加密为数据的加密与解密提供了⼀个⾮常安全的⽅法,它使⽤了⼀对密钥,公钥(public key)和私钥(private key)。
java加解密算法--常见加解密算法
java加解密算法--常见加解密算法什么是加密算法?百度百科给出的解释如下:数据加密的基本过程就是对原来为明⽂的⽂件或数据按某种算法进⾏处理,使其成为不可读的⼀段代码,通常称为“密⽂”,使其只能在输⼊相应的密钥之后才能显⽰出本来内容,通过这样的途径来达到保护数据不被⾮法⼈窃取、阅读的⽬的。
该过程的逆过程为解密,即将该编码信息转化为其原来数据的过程。
简单来说,就是把某⼀段数据(明⽂),按照“某种规则”转换成另外⼀段不可读的数据(密⽂)。
这⾥选定的“规则”,就是加密算法。
理所当然,当别⼈拿到“密⽂”,解析出“明⽂”的难度取决于加密算法的破解难度。
1. 算法种类单向加密对称加密⾮对称加密1.1 单向加密即加密之后不能解密,⼀般⽤于数据验证1) Base64Base64 编码是从⼆进制到字符的过程,⽤ 64 个字符来表⽰任意的⼆进制数据。
对于开发⼈员来说,拿到密⽂,很容易就能够解析成明⽂。
因此严格来说,Base64不能称之为加密算法,仅仅是⼀种编码⽅式。
它常常⽤于发送Http请求时对URL中参数的编码,保证不是⼀眼就看出来了这些参数的意义,或者图⽚编码传输。
转换⽅法:1 字节(byte) = 8 ⽐特位(bit)Base64 定义了 64 (2^6)个可打印字符表⽰⼆进制的⽅法,也就是说 6 个 bit 的⼆进制数据可以⽤对应的字符代替表⽰对于连续多个⼆进制数据,每 3 个字节⼀组进⾏转换,3个字节 24 bit,然后将其分为 4 部分(3×8 = 4×6),每个部分刚好 6 bit,⾼位补0,将 6 bit ⼆进制转换为 Base64 定义的字符即完成转换若⼆进制数据字节数不是 3 的倍数,Base64 就将剩下的⼆进制数据补 0 ⾄ 3 的倍数,全 0 的⽤字符 “=” 代替⽐如:我要⽤Base64编码⼀个字符串“abc”,实际算法如下:'a','b','c'的ASCII标准编码分别为(⼗进制)97,98,99,因此⽤⼆进制表⽰“abc”字符串就是:01100001,01100010,01100011 ---3组,每组8字节Base64的原理:将这三组8字节,分成4组6字节011000,010110, 001001,100011 ---4组,每组6字节⾼位补000011000,00010110, 00001001,00100011这四个⼆进制数组对应⼗进制的数值分别是:24,22,9,35,RFC2045(Base64解码表)分别为:Y,W,J,j即:"abc"经过Base64编码后,为"YWJj"。
JAVA实现AES加密算法代码
JAVA实现AES加密算法代码以下是一个简单的JAVA实现AES加密算法的代码:```javaimport javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.security.Key;public class AESprivate static final String ALGORITHM = "AES";private static final String TRANSFORMATION ="AES/ECB/PKCS5Padding";public static byte[] encrypt(String key, byte[] data) throws ExceptionKey secretKey = new SecretKeySpec(key.getBytes(, ALGORITHM);Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.ENCRYPT_MODE, secretKey);return cipher.doFinal(data);}public static byte[] decrypt(String key, byte[] encryptedData) throws ExceptionKey secretKey = new SecretKeySpec(key.getBytes(, ALGORITHM);Cipher cipher = Cipher.getInstance(TRANSFORMATION);cipher.init(Cipher.DECRYPT_MODE, secretKey);return cipher.doFinal(encryptedData);}public static void main(String[] args)tryString key = "ThisIsASecretKey";String data = "Hello World!";byte[] encryptedData = encrypt(key, data.getBytes();System.out.println("Encrypted Data: " + newString(encryptedData));byte[] decryptedData = decrypt(key, encryptedData);System.out.println("Decrypted Data: " + newString(decryptedData));} catch (Exception e)e.printStackTrace(;}}```这个代码包含了两个方法,一个是用于加密数据的`encrypt`方法,另一个是用于解密数据的`decrypt`方法。
java实现HTTPS单向认证TLS指定加密套件
java实现HTTPS单向认证TLS指定加密套件由于HTTP是明⽂传输,会造成安全隐患,所以在⼀些特定场景中,必须使⽤HTTPS协议,简单来说HTTPS=HTTP+SSL/TLS。
服务端和客户端的信息传输都是通过TLS进⾏加密。
这样就能在⼀定程度上避免敏感信息被截取。
在通信过程中,请求⽅称为客户端,响应⽅称为服务端。
HTTPS请求流程如图:1、客户端向服务端发送加密版本、加密算法种类、随机数信息等。
2、服务端返回客户端发送的信息并带上服务端证书(公钥证书)。
3、客户端效验服务端证书的合法性。
4、验证不通过终⽌通信,验证通过继续通信,客户端将⾃⼰所⽀持的所有加密算法全部发送给服务端供服务端进⾏选择。
5、服务端在客户端发送的加密算法中选择加密程度最⾼的机密⽅式。
6、服务端将选择的加密算法通过明⽂返回给客户端。
7、客户端收到服务端返回的加密⽅式后,使⽤该加密⽅式⽣成随机码(⽤作后续通信过程中加密的秘钥),使⽤服务端返回的公钥加密后发送⾄服务端。
8、服务端收到信息后,使⽤⾃⼰的私钥进⾏解密,获取加密秘钥。
在之后的通信中,客户端和服务端都将采⽤该秘钥进⾏加密。
⽣成证书和转换证书格式需要密码,秘密建议全部设置⼀致的。
# ⽣成root私钥openssl genrsa -out root.key 1024# 根据私钥创建根证书请求⽂件,需要输⼊⼀些证书的元信息:邮箱、域名、密码等openssl req -new -out root.csr -key root.key# 结合私钥和请求⽂件,创建根证书,有效期10年openssl x509 -req -in root.csr -out root.crt -signkey root.key -CAcreateserial -days 3650# 创建服务端私钥openssl genrsa -out server.key 1024# 根据私钥⽣成请求⽂件需要证书元信息:邮箱、域名、密码等openssl req -new -out server.csr -key server.key# 结合私钥和请求⽂件创建服务端证书,有效期10年openssl x509 -req -in server.csr -out server.crt -signkey server.key -CA root.crt -CAkey root.key -CAcreateserial -days 3650单向认证不需要⽣成客户端证书,所以做单向认证的证书到此就完成了。
JAVA实现AES的加密和解密算法
JAVA实现AES的加密和解密算法JAVA实现AES的加密和解密算法加密模式为 AES-128-CBC1import javax.crypto.Cipher;2import javax.crypto.spec.IvParameterSpec;3import javax.crypto.spec.SecretKeySpec;45import sun.misc.BASE64Decoder;6import sun.misc.BASE64Encoder;78/**AES 是⼀种可逆加密算法,对⽤户的敏感信息加密处理9* 对原始数据进⾏AES加密后,在进⾏Base64编码转化;10*/11public class AESOperator {12/*13* 加密⽤的Key 可以⽤26个字母和数字组成14* 此处使⽤AES-128-CBC加密模式,key需要为16位。
15*/16private String sKey=”0123456789abcdef”;17private String ivParameter=”0123456789abcdef”;18private static AESOperator instance=null;19private AESOperator(){2021 }22public static AESOperator getInstance(){23if (instance==null)24 instance= new AESOperator();25return instance;26 }27// 加密28public String encrypt(String sSrc) throws Exception {29 Cipher cipher = Cipher.getInstance(“AES/CBC/PKCS5Padding”);30byte[] raw = sKey.getBytes();31 SecretKeySpec skeySpec = new SecretKeySpec(raw, “AES”);32 IvParameterSpec iv = new IvParameterSpec(ivParameter.getBytes());//使⽤CBC模式,需要⼀个向量iv,可增加加密算法的强度33 cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);34byte[] encrypted = cipher.doFinal(sSrc.getBytes(“utf-8″));35return new BASE64Encoder().encode(encrypted);//此处使⽤BASE64做转码。
java生成MD5加密
使用Java 生成MD5 编码MD5即Message-Digest Algorithm 5(信息-摘要算法5),是一种用于产生数字签名的单项散列算法,在1991年由MIT Laboratory for Computer Science(IT计算机科学实验室)和RSA Data Security Inc(RSA数据安全公司)的Ronald L. Rivest教授开发出来,经由MD2、MD3和MD4发展而来。
MD5算法的使用不需要支付任何版权费用。
它的作用是让大容量信息在用数字签名软件签私人密匙前被"压缩"成一种保密的格式(将一个任意长度的“字节串”通过一个不可逆的字符串变换算法变换成一个128bit的大整数,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。
)在Java 中,java.security.MessageDigest 中已经定义了MD5 的计算,所以我们只需要简单地调用即可得到MD5 的128 位整数。
然后将此128 位计16 个字节转换成16 进制表示即可。
代码如下:package com.tsinghua;/*** MD5的算法在RFC1321 中定义* 在RFC 1321中,给出了Test suite用来检验你的实现是否正确:* MD5 ("") = d41d8cd98f00b204e9800998ecf8427e* MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661* MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72* MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0* MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b** @author haogj** 传入参数:一个字节数组* 传出参数:字节数组的MD5 结果字符串*/public class MD5 {public static String getMD5(byte[] source) {String s = null;char hexDigits[] = { // 用来将字节转换成16 进制表示的字符'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};try{java.security.MessageDigest md = java.security.MessageDigest.getInstance( "MD5" );md.update( source );byte tmp[] = md.digest(); // MD5 的计算结果是一个128 位的长整数,// 用字节表示就是16 个字节char str[] = new char[16 * 2]; // 每个字节用16 进制表示的话,使用两个字符,// 所以表示成16 进制需要32 个字符int k = 0; // 表示转换结果中对应的字符位置for (int i = 0; i < 16; i++) { // 从第一个字节开始,对MD5 的每一个字节 // 转换成16 进制字符的转换byte byte0 = tmp[i]; // 取第i 个字节str[k++] = hexDigits[byte0 >>> 4 & 0xf]; // 取字节中高4 位的数字转换,// >>> 为逻辑右移,将符号位一起右移str[k++] = hexDigits[byte0 & 0xf]; // 取字节中低4 位的数字转换}s = new String(str); // 换后的结果转换为字符串}catch( Exception e ){e.printStackTrace();}return s;}}测试代码如下:import com.tsinghua.*;public class TestMD5{public static void main( String xu[] ){ // 计算"a" 的MD5 代码,应该为:0cc175b9c0f1b6a831c399e269772661 System.out.println( MD5.getMD5("a".getBytes()) );}}。
hutool-all 密码加密方法
hutool-all 密码加密方法全文共四篇示例,供读者参考第一篇示例:在应用程序开发中,密码加密是一项非常重要的安全措施。
Hutool是一个Java工具类库,提供了一系列简便易用的密码加密方法,可以帮助开发者轻松实现数据加密和解密的功能。
本文将介绍Hutool-all中的一些常用密码加密方法,并讨论如何在实际项目中应用这些方法保护用户数据安全。
Hutool-all是一个功能强大的Java工具类库,其中包含了丰富的工具方法和类,可以帮助开发者简化程序开发过程。
在密码加密方面,Hutool-all提供了多种加密算法,包括MD5、SHA-1、SHA-256、AES等。
接下来,我们将逐一介绍这些加密算法的用法和特点。
我们来看一下最常用的MD5加密算法。
MD5是一种消息摘要算法,可以将任意长度的数据转换为一个128位的数字指纹。
在Hutool-all中,可以通过如下代码来实现对字符串进行MD5加密:```String password = "123456";String md5Password = SecureUtil.md5(password);System.out.println("MD5加密后的密码:" + md5Password);```通过上面的代码,我们可以看到将字符串"123456"加密为MD5后的密码。
MD5是一种单向加密算法,不可逆,但可以用于验证原始数据的完整性。
在实际应用中,可以将用户的密码存储为MD5加密后的值,确保数据安全。
除了MD5之外,Hutool-all还提供了SHA系列的加密算法,包括SHA-1和SHA-256。
这些算法可以生产更长的摘要结果,提高了加密的安全性。
下面是一个使用SHA-256加密算法的示例代码:通过以上代码,我们可以看到将密码"123456"使用SHA-256算法加密后的结果。
java加密算法之JWT篇
java加密算法之JWT篇加密字符串public static String token(String subject, String secretKey, Date date) {Key key = decodeKey(secretKey);String token = Jwts.builder().setExpiration(date).setSubject(subject).signWith(SignatureAlgorithm.HS256, key).compact();String base64Token = new BASE64Encoder().encode(token.getBytes());base64Token = base64Token.replace('=', '*');base64Token = base64Token.replace("\n", "");base64Token = base64Token.replace("\r", "");return base64Token;}多数据public static String tokenParams(Map<String, Object> claims, String secretKey, Date date) {Key key = decodeKey(secretKey);String token = Jwts.builder().setExpiration(date).setClaims(claims).signWith(SignatureAlgorithm.HS256, key).compact();String base64Token = new BASE64Encoder().encode(token.getBytes());base64Token = base64Token.replace('=', '*');base64Token = base64Token.replace("\n", "");base64Token = base64Token.replace("\r", "");return base64Token;}解密字符串public static String verify(String token, String secretKey) {try {token = token.replace('*', '=');Key key = decodeKey(secretKey);String decodeToken = new String(new BASE64Decoder().decodeBuffer(token));String subject = Jwts.parser().setSigningKey(key).parseClaimsJws(decodeToken).getBody().getSubject();return subject;} catch (Exception e) {}return null;}多数据public static Map<String, Object> verifyParams(String token, String secretKey) {try {token = token.replace('*', '=');Key key = decodeKey(secretKey);String decodeToken = new String(new BASE64Decoder().decodeBuffer(token));Map<String, Object> claims = Jwts.parser().setSigningKey(key).parseClaimsJws(decodeToken).getBody();return claims;} catch (Exception e) {}return null;}测试public static void main(String[] args) {String subject = "A478YSKJDFHJL84673IUASD8";String secretKey = generateSecretKey();Date date = new Date();String strToken = token(subject,secretKey,MyDateUtils.addDays(date,1));System.out.println("There is token result :"+strToken);String verify = verify(strToken,secretKey);System.out.println("There is verify token result :"+verify);Map<String,Object> params = new HashMap<>();params.put("key","value");String objToken = tokenParams(params, secretKey, MyDateUtils.addDays(date, 1));System.out.println("There is token object result :"+objToken);Map<String,Object> verifyObj = verifyParams(objToken,secretKey);System.out.println("There is verify object token result :"+JsonUtils.toJson(verifyObj));}测试结果token过期测试public static void main(String[] args) {String subject = "A478YSKJDFHJL84673IUASD8";String secretKey = generateSecretKey();Date date = new Date();String strToken = token(subject,secretKey,MyDateUtils.addDays(date,-1));System.out.println("There is token result :"+strToken);String verify = verify(strToken,secretKey);System.out.println("There is verify token result :"+verify);}token过期测试结果全代码public class JwtUtils {public static String secretKey = "";public static String generateSecretKey() {String secretKey = "";String uuid = new BASE64Encoder().encode(UUID.randomUUID().toString().getBytes());secretKey = uuid;return secretKey;}public static Key generateKey(String secretKey) {Key key = null;try {byte[] keyBytes = new BASE64Decoder().decodeBuffer(secretKey);key = new SecretKeySpec(keyBytes, SignatureAlgorithm.HS256.getJcaName());} catch (Exception e) {e.printStackTrace();}return key;}public static Key decodeKey(String secretKey) {Key key = null;try {byte[] keyBytes = new BASE64Decoder().decodeBuffer(secretKey);key = new SecretKeySpec(keyBytes, SignatureAlgorithm.HS256.getJcaName());} catch (Exception e) {e.printStackTrace();}return key;}public static String tokenParams(Map<String, Object> claims, String secretKey, Date date) {Key key = decodeKey(secretKey);String token = Jwts.builder().setExpiration(date).setClaims(claims).signWith(SignatureAlgorithm.HS256, key).compact(); String base64Token = new BASE64Encoder().encode(token.getBytes());base64Token = base64Token.replace('=', '*');base64Token = base64Token.replace("\n", "");base64Token = base64Token.replace("\r", "");return base64Token;}public static Map<String, Object> verifyParams(String token, String secretKey) {try {token = token.replace('*', '=');Key key = decodeKey(secretKey);String decodeToken = new String(new BASE64Decoder().decodeBuffer(token));Map<String, Object> claims = Jwts.parser().setSigningKey(key).parseClaimsJws(decodeToken).getBody();return claims;} catch (Exception e) {e.printStackTrace();}return null;}public static String token(String subject, String secretKey, Date date) {Key key = decodeKey(secretKey);String token = Jwts.builder().setExpiration(date).setSubject(subject).signWith(SignatureAlgorithm.HS256, key).compact(); String base64Token = new BASE64Encoder().encode(token.getBytes());base64Token = base64Token.replace('=', '*');base64Token = base64Token.replace("\n", "");base64Token = base64Token.replace("\r", "");return base64Token;}public static String verify(String token, String secretKey) {try {token = token.replace('*', '=');Key key = decodeKey(secretKey);String decodeToken = new String(new BASE64Decoder().decodeBuffer(token));String subject = Jwts.parser().setSigningKey(key).parseClaimsJws(decodeToken).getBody().getSubject();return subject;} catch (Exception e) {e.printStackTrace();}return null;}public static void main(String[] args) {String subject = "A478YSKJDFHJL84673IUASD8";String secretKey = generateSecretKey();Date date = new Date();String strToken = token(subject,secretKey,MyDateUtils.addDays(date,-1));System.out.println("There is token result :"+strToken);String verify = verify(strToken,secretKey);System.out.println("There is verify token result :"+verify);Map<String,Object> params = new HashMap<>();params.put("key","value");String objToken = tokenParams(params, secretKey, MyDateUtils.addDays(date, 1));System.out.println("There is token object result :"+objToken);Map<String,Object> verifyObj = verifyParams(objToken,secretKey);System.out.println("There is verify object token result :"+JsonUtils.toJson(verifyObj));}}。
java加密解密算法MD5SHA1,DSA
java加密解密算法MD5SHA1,DSA通常,使⽤的加密算法⽐较简便⾼效,密钥简短,加解密速度快,破译极其困难。
本⽂介绍了MD5/SHA1,DSA,DESede/DES,Diffie-Hellman的使⽤。
第1章基础知识1.1. 单钥密码体制单钥密码体制是⼀种传统的加密,是指信息的发送⽅和接收⽅共同使⽤同⼀把密钥进⾏加解密。
通常,使⽤的加密算法⽐较简便⾼效,密钥简短,加解密速度快,破译极其困难。
但是加密的安全性依靠密钥保管的安全性,在公开的上安全地传送和保管密钥是⼀个严峻的问题,并且如果在多⽤户的情况下密钥的保管安全性也是⼀个问题。
单钥密码体制的代表是美国的DES1.2. 消息摘要⼀个消息摘要就是⼀个数据块的数字指纹。
即对⼀个任意长度的⼀个数据块进⾏计算,产⽣⼀个唯⼀指印(对于SHA1是产⽣⼀个20字节的⼆进制数组)。
消息摘要有两个基本属性:两个不同的报⽂难以⽣成相同的摘要难以对指定的摘要⽣成⼀个报⽂,⽽由该报⽂反推算出该指定的摘要代表:美国国家标准技术研究所的SHA1和⿇省理⼯学院Ronald Rivest提出的MD51.3. Diffie-Hellman密钥⼀致协议密钥⼀致协议是由公开密钥密码体制的奠基⼈Diffie和Hellman所提出的⼀种思想。
先决条件,允许两名⽤户在公开媒体上交换信息以⽣成"⼀致"的,可以共享的密钥代表:指数密钥⼀致协议(Exponential Key Agreement Protocol)1.4. ⾮对称算法与公钥体系1976 年,Dittie和Hellman为解决密钥管理问题,在他们的奠基性的⼯作"密码学的新⽅向"⼀⽂中,提出⼀种密钥交换协议,允许在不安全的媒体上通过通讯双⽅交换信息,安全地传送秘密密钥。
在此新思想的基础上,很快出现了⾮对称密钥密码体制,即公钥密码体制。
在公钥体制中,加密密钥不同于解密密钥,加密密钥公之于众,谁都可以使⽤;解密密钥只有解密⼈⾃⼰知道。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本篇内容简要介绍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代码实现如下:
主要就是BASE64Encoder、BASE64Decoder两个类,我们只需要知道使用对应的方法即可。
另,BASE 加密后产生的字节位数是8的倍数,如果不够位数以=符号填充。
MD5
MD5 -- message-digest algorithm 5 (信息-摘要算法)缩写,广泛用于加密和解密技术,常用于文件校验。
校验?不管文件多大,经过MD5后都能生成唯一的MD5值。
好比现在的ISO校验,都是MD5校验。
怎么用?当然是把ISO经过MD5后产生MD5的值。
一般下载linux-ISO的朋友都见过下载链接旁边放着MD5的串。
就是用来验证文件是否一致的。
通过java代码实现如下:
通常我们不直接使用上述MD5加密。
通常将MD5产生的字节数组交给BASE64再加密一把,得到相应的字符串。
SHA
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域。
虽然,SHA与MD5通过碰撞法都被破解了,但是SHA仍然是公认的安全加密算法,较之MD5更为安全。
通过java代码实现如下:
HMAC
HMAC(Hash Message Authentication Code,散列消息鉴别码,基于密钥的Hash算法的认证协议。
消息鉴别码实现鉴别的原理是,用公开函数和密钥产生一个固定长度的值作为认证标识,用这个标识鉴别消息的完整性。
使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。
接收方利用与发送方共享的密钥进行鉴别认证等。
通过java代码实现如下:
给出一个完整类,如下:
再给出一个测试类:
控制台输出:
BASE64的加密解密是双向的,可以求反解。
MD5、SHA以及HMAC是单向加密,任何数据加密后只会产生唯一的一个加密串,通常用来校验数据在传输过程中是否被修改。
其中HMAC算法有一个密钥,增强了数据传输过程中的安全性,强化了算法外
的不可控因素。
单向加密的用途主要是为了校验数据在传输过程中是否被修改。