Java中的加密与解密方法简介
最编程
2024-02-12 14:13:05
...
1、MD5(Message Digest Algorithm)加密算法
是一种单向加密算法,只能加密不能解密,示例
/** * MD5简单加密 * @param content 加密内容 * @return String */ public static String md5Encrypt(final String content) { MessageDigest md5 = null; try { md5 = MessageDigest.getInstance(ALGORITHM_MD5); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } // md5.update(text.getBytes()); //digest()最后返回md5 hash值,返回值为8位字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符 //BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值 BigInteger digest = new BigInteger(md5.digest(content.getBytes())); //32位 return digest.toString(16); }
2、BASE64进行加密/解密
通常用作对二进制数据进行加密,示例
/** * base64加密 * @param content 待加密内容 * @return byte[] */ public static byte[] base64Encrypt(final String content) { return Base64.getEncoder().encode(content.getBytes()); } /** * base64解密 * @param encoderContent 已加密内容 * @return byte[] */ public static byte[] base64Decrypt(final byte[] encoderContent) { return Base64.getDecoder().decode(encoderContent); }
3、DES(Data Encryption Standard)对称加密/解密
数据加密标准算法,和BASE64最明显的区别就是有一个工作密钥,该密钥既用于加密、也用于解密,并且要求密钥是一个长度至少大于8位的字符串,示例
/** * DES加密 * @param key 秘钥key * @param content 待加密内容 * @return byte[] */ public static byte[] DESEncrypt(final String key, final String content) { return processCipher(content.getBytes(), getSecretKey(key), Cipher.ENCRYPT_MODE , ALGORITHM_DES); } /** * DES解密 * @param key 秘钥key * @param encoderContent 已加密内容 * @return byte[] */ public static byte[] DESDecrypt(final String key, final byte[] encoderContent) { return processCipher(encoderContent, getSecretKey(key), Cipher.DECRYPT_MODE, ALGORITHM_DES); }
4、RSA非对称加密/解密
非对称加密算法的典型代表,既能加密、又能解密。和对称加密算法比如DES的明显区别在于用于加密、解密的密钥是不同的。使用RSA算法,只要密钥足够长(一般要求1024bit),加密的信息是不能被破解的。示例
/** * RSA加密 * @param content 待加密内容 * @return byte[] */ public static byte[] RSAEncrypt(final String content) { return processCipher(content.getBytes(), keyPair.getPrivate(), Cipher.ENCRYPT_MODE , ALGORITHM_RSA); } /** * RSA解密 * @param encoderContent 已加密内容 * @return byte[] */ public static byte[] RSADecrypt(final byte[] encoderContent) { return processCipher(encoderContent, keyPair.getPublic(), Cipher.DECRYPT_MODE, ALGORITHM_RSA); }
5、SHA(Secure Hash Algorithm,安全散列算法)
数字签名等密码学应用中重要的工具,被广泛地应用于电子商务等信息安全领域,示例
/** * SHA加密 * @param content 待加密内容 * @return String */ public static String SHAEncrypt(final String content) { try { MessageDigest sha = MessageDigest.getInstance(ALGORITHM_SHA); byte[] sha_byte = sha.digest(content.getBytes()); StringBuffer hexValue = new StringBuffer(); for (byte b : sha_byte) { //将其中的每个字节转成十六进制字符串:byte类型的数据最高位是符号位,通过和0xff进行与操作,转换为int类型的正整数。 String toHexString = Integer.toHexString(b & 0xff); hexValue.append(toHexString.length() == 1 ? "0" + toHexString : toHexString); } return hexValue.toString(); // StringBuffer hexValue2 = new StringBuffer(); // for (int i = 0; i < sha_byte.length; i++) { // int val = ((int) sha_byte[i]) & 0xff; // if (val < 16) { // hexValue2.append("0"); // } // hexValue2.append(Integer.toHexString(val)); // } // return hexValue2.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; }
6、HMAC(Hash Message Authentication Code,散列消息鉴别码)
使用一个密钥生成一个固定大小的小数据块,即MAC,并将其加入到消息中,然后传输。接收方利用与发送方共享的密钥进行鉴别认证,示例
/** * HMAC加密 * @param key 给定秘钥key * @param content 待加密内容 * @return String */ public static byte[] HMACEncrypt(final String key, final String content) { try { SecretKey secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM_MAC); Mac mac = Mac.getInstance(secretKey.getAlgorithm()); //初始化mac mac.init(secretKey); return mac.doFinal(content.getBytes()); } catch (Exception e) { e.printStackTrace(); } return null; }
测试代码:
public static void main(String[] args) { //md5简单加密 String text = "i am text"; System.out.println(EnDecoderUtil.md5Encrypt(text)); //base64进行加密解密,通常用作对二进制数据进行加密 byte[] base64Encrypt = EnDecoderUtil.base64Encrypt("123456789"); String toHexString = HexUtils.toHexString(base64Encrypt); System.out.println(toHexString); byte[] base64Decrypt = EnDecoderUtil.base64Decrypt(base64Encrypt); System.out.println(new String(base64Decrypt)); //DES对称加密/解密 //要求key至少长度为8个字符 String key = "123456789"; //加密 byte[] encode_bytes = EnDecoderUtil.DESEncrypt(key, "Hello, DES"); System.out.println(Base64.getEncoder().encodeToString(encode_bytes)); //解密 byte[] decode_bytes = EnDecoderUtil.DESDecrypt(key, encode_bytes); System.out.println(new String(decode_bytes)); //RSA //数据使用私钥加密 byte[] en_byte = EnDecoderUtil.RSAEncrypt("Hi, RSA"); System.out.println(Base64.getEncoder().encodeToString(en_byte)); //用户使用公钥解密 byte[] de_byte = EnDecoderUtil.RSADecrypt(en_byte); System.out.println(new String(de_byte)); //服务器根据私钥和加密数据生成数字签名 byte[] sign_byte = EnDecoderUtil.getSignature(en_byte); System.out.println(Base64.getEncoder().encodeToString(sign_byte)); //用户根据公钥、加密数据验证数据是否被修改过 boolean verify_result = EnDecoderUtil.verifySignature(en_byte, sign_byte); System.out.println(verify_result); //SHA String sha = EnDecoderUtil.SHAEncrypt("Hi, RSA"); System.out.println(sha); //HMAC byte[] mac_bytes = EnDecoderUtil.HMACEncrypt(key, "Hi, HMAC"); System.out.println(HexUtils.toHexString(mac_bytes)); }
源码参照Github
上一篇: 区块链中的密码学实战:详解哈希函数与加密解密技术的应用
下一篇: 加密与解密
推荐阅读
-
一种结构设计模式,允许在对象中动态添加新行为。它通过创建一个封装器来实现这一目的,即把对象放入一个装饰器类中,然后把这个装饰器类放入另一个装饰器类中,以此类推,形成一个封装器链。这样,我们就可以在不改变原始对象的情况下动态添加新行为或修改原始行为。 在 Java 中,实现装饰器设计模式的步骤如下: 定义一个接口或抽象类作为被装饰对象的基类。 公共接口 Component { void operation; } } 在本例中,我们定义了一个名为 Component 的接口,该接口包含一个名为 operation 的抽象方法,该方法定义了被装饰对象的基本行为。 定义一个实现基类方法的具体装饰对象。 公共类 ConcreteComponent 实现 Component { public class ConcreteComponent implements Component { @Override public void operation { System.out.println("ConcreteComponent is doing something...") ; } } 定义一个抽象装饰器类,该类继承于基类,并将装饰对象作为一个属性。 公共抽象类装饰器实现组件 { protected Component 组件 public Decorator(Component component) { this.component = component; } } @Override public void operation { component.operation; } } } 在这个示例中,我们定义了一个名为 Decorator 的抽象类,它继承了 Component 接口,并将被装饰对象作为一个属性。在操作方法中,我们调用了被装饰对象上的同名方法。 定义一个具体的装饰器类,继承自抽象装饰器类并实现增强逻辑。 公共类 ConcreteDecoratorA extends Decorator { public ConcreteDecoratorA(Component 组件) { super(component); } } public void operation { super.operation System.out.println("ConcreteDecoratorA 正在添加新行为......") ; } } 在本例中,我们定义了一个名为 ConcreteDecoratorA 的具体装饰器类,它继承自装饰器抽象类,并实现了操作方法的增强逻辑。在操作方法中,我们首先调用被装饰对象上的同名方法,然后添加新行为。 使用装饰器增强被装饰对象。 公共类 Main { public static void main(String args) { Component 组件 = new ConcreteComponent; component = new ConcreteDecoratorA(component); 组件操作 } } 在这个示例中,我们首先创建了一个被装饰对象 ConcreteComponent,然后通过 ConcreteDecoratorA 类创建了一个装饰器,并将被装饰对象作为参数传递。最后,调用装饰器的操作方法,实现对被装饰对象的增强。 使用场景 在 Java 中,装饰器模式被广泛使用,尤其是在 I/O 中。Java 中的 I/O 库使用装饰器模式实现了不同数据流之间的转换和增强。 让我们打开文件 a.txt,从中读取数据。InputStream 是一个抽象类,FileInputStream 是专门用于读取文件流的子类。BufferedInputStream 是一个支持缓存的数据读取类,可以提高数据读取的效率,具体代码如下: @Test public void testIO throws Exception { InputStream inputStream = new FileInputStream("C:/bbb/a.txt"); // 实现包装 inputStream = new BufferedInputStream(inputStream); byte bytes = new byte[1024]; int len; while((len = inputStream.read(bytes)) != -1){ System.out.println(new String(bytes, 0, len)); } } } } 其中 BufferedInputStream 对读取数据进行了增强。 这样看来,装饰器设计模式和代理模式似乎有点相似,接下来让我们讨论一下它们之间的区别。 第三,与代理模式的区别: 代理模式的目的是控制对对象的访问,它在对象外部提供一个代理对象来控制对原对象的访问。代理对象和原始对象通常实现相同的接口或继承相同的类,以确保两者可以相互替换。 装饰器模式的目的是动态增强对象的功能,而这是通过对象内部的包装器来实现的。在装饰器模式中,装饰器类和被装饰对象通常实现相同的接口或继承自相同的类,以确保两者可以相互替代。装饰器模式也被称为封装器模式。 在代理模式中,代理类附加了与原类无关的功能。
-
iCloud 切换区域,中国区保留 appStore(更新)--自 2018 年 2 月 28 日起,中国区 iCloud 由云上贵州管理 苹果公司发布的公告 https://support.apple.com/zh-cn/HT208352 关键词 关键部分 受影响的 iCloud 账户:国家或地区设置为 "中国 "的 Apple ID。 iCloud 包含的服务照片、邮件、通讯录、日历、提醒事项、备忘、书签、钱包、钥匙串、云备份、云驱动器、应用程序数据 新条款和条件: 同意仅出于本协议允许的目的并在中国法律允许的范围内使用服务。 云桂洲在提供服务时应使用合理的技能并尽职尽责,但在适用法律允许的最大范围内,我们不保证或担保您通过本服务存储或访问的任何内容不会意外损坏、崩溃、丢失或根据本协议的条款被删除,如果发生此类损坏、崩溃、丢失或删除,我们不承担任何责任。您应自行负责维护您的信息和数据的适当备份。 Apple 和云上贵州有权访问您存储在服务中的所有数据,包括有权根据适用法律相互之间共享、交换和披露所有用户数据(包括内容)。 本协议的解释、效力和履行应适用*法律。对于因本协议引起的或与本协议有关的任何争议,云桂洲和您同意提交中国国际经济贸易仲裁委员会(CIETAC)根据提交仲裁时有效的法律在北京进行具有约束力的仲裁。 由云桂洲管理,用户选择: 停用; ID 到地区; 受 iCloud(由云桂洲运营)条款和条件约束 首先,我想说说我对数据安全的看法。 当我在朋友圈发布通知时,有些朋友回复说国外的操作并没有多安全,或者国外的安全只是相对于国外而言的等等。首先,我非常感谢这些朋友,这让我反思什么是数据安全。以下观点均属个人观点: 国外的月亮一定比国内圆? 这是一个根深蒂固的问题,只要有人说国外的东西比国内好,就会有人嘲笑崇洋媚外。我觉得我们在某些方面应该向国外学习,比如搜索引擎和版权问题。打开百度搜索 "数据安全",第一行肯定是广告。打开谷歌搜索 "数据安全",第一条就是 "数据安全_百度百科" .....各种版权问题大家都明白,支持正版,但不仅客户一心想找免费破解,就连作者也往往没有保护自己劳动成果或产品的想法。但从另一个层面来说,国内的发展和安全,甩国外几条街。没有说哪里好,哪里不好,辩证地去学习更好。 国外也有别有用心的数据泄露,谈何安全? 从加密解密的角度看,自古以来就没有绝对安全的加密,只有相对安全的做法。苹果的棱镜门、微软的 cpu 漏洞,各种参差不齐的被破解案例 ....是的,这的确是一个很好的论据,但凡事都不能只看一面,当年苹果面对FBI破解手机的要求,几经论证,苹果还是拒绝破解。这点拿到国内,只要上面的文件传达下去,还有企业敢说不吗?还敢说不吗? 关于这次iCloud数据迁移个人看法? 把数据迁移到贵州的云端,相当于把手机的所有数据都存储在贵州的云端服务器上。也许访问数据的速度会快很多,但我会把我的iCloud区放到美国,因为我不想数据存在云上贵州后经常接到莫名其妙的电话或短信,更不想因为乱用国外服务器而被请去喝茶。iCloud一个ID,即从中国账号转到美国区,主要用于数据存在美国服务器上。appStore一个ID,除了注册一个中国ID外,专门用来下载应用用,因为国外ID不支持酷狗和网易云等应用。麻烦的是,用了新的 appStore ID 后,当前的应用还得重新下载安装,因为旧的应用 ID 与新的应用 ID 不兼容,安装不了。最后,iCloud迁移后,国内用户使用美国服务器,估计要 "扶墙 "了。 专业步骤: 首先,进行appleID设置,这是前提条件,否则无法选择转移区域! 取消 appleID 的双重认证 取消家庭共享选项 二、窗口下载并安装 icloud 3.0 版
-
Java 中的 getResource 方法以及与路径相关的问题
-
Java 类加载器的作用 - 简介:类加载器是 Java™ 中一个非常重要的概念。类加载器负责将 Java 类的字节码加载到 Java 虚拟机中。本文首先详细介绍了 Java 类加载器的基本概念,包括代理模型、加载类的具体过程和线程上下文类加载器等。然后介绍了如何开发自己的类加载器,最后介绍了类加载器在 Web 容器和 OSGi™ 中的应用。 类加载器是 Java 语言的一项创新,也是 Java 语言广受欢迎的重要原因之一。它允许将 Java 类动态加载到 Java 虚拟机中并执行。类加载器从 JDK 1.0 开始出现,最初是为了满足 Java Applets 的需求而开发的,Java Applets 需要从远程位置下载 Java 类文件并在浏览器中执行。现在,类加载器已广泛应用于网络容器和 OSGi。一般来说,Java 应用程序的开发人员不需要直接与类加载器交互;Java 虚拟机的默认行为足以应对大多数情况。但是,如果遇到需要与类加载器交互的情况,而您又不太了解类加载器的机制,就很容易花费大量时间调试异常,如 ClassNotFoundException 和 NoClassDefFoundError。本文将详细介绍 Java 的类加载器,帮助读者深入理解 Java 语言中的这一重要概念。下面先介绍一些基本概念。 类加载器的基本概念 顾名思义,类加载器用于将 Java 类加载到 Java 虚拟机中。一般来说,Java 虚拟机以如下方式使用 Java 类:Java 源程序(.java 文件)经 Java 编译器编译后转换为 Java 字节代码(.class 文件)。类加载器负责读取 Java 字节代码并将其转换为 java.lang 实例。每个实例都用来表示一个 Java 类。通过该实例的 newInstance 方法创建该类的对象。实际情况可能更加复杂,例如,Java 字节代码可能是由工具动态生成或通过网络下载的。 基本上,所有类加载器都是 java.lang.ClassLoader 类的实例。下面将详细介绍这个 Java 类。 java.lang.ClassLoader 类简介 java.lang.ClassLoader 类的基本职责是根据给定类的名称为其查找或生成相应的字节码,然后根据这些字节码定义一个 Java 类,即 java.lang.Class 类的实例。除此之外,ClassLoader 还负责加载 Java 应用程序所需的资源,如图像文件和配置文件。不过,本文只讨论它加载类的功能。为了履行加载类的职责,ClassLoader 提供了许多方法,其中比较重要的方法如表 1 所示。下文将详细介绍这些方法。 表 1.与加载类相关的 ClassLoader 方法
-
实操示例:在Java中运用Quality类的方法与技巧
-
JavaScript中的整数运算:上取整、下取整与四舍五入方法简介
-
PHP中的加密与解密函数详解
-
在Java中,常见的方式对数据进行隐私保护(数据脱敏):简介与方法
-
在个保法规指导下,打造数据中台的第二篇章:脱敏与匿名化处理(加密与解密方法探讨)
-
Java中的加密与解密方法简介