Apache Shiro 加密
加密,是用来保护信息的手段,将数据转换为一些像乱码的东西使得没有人能看懂。Shiro侧重于密码学的两个核心元素:Cipher和Hash。这两者的区别在于是否可逆,Cipher加密通常是我们希望能将密文转回明文的,这通常需要密钥,而Hash则是对数据进行不可逆的加密
Shiro加密的主要目标是使得传统的极度复杂的加密变得简单可用,提供一个具有强健壮性的加密手段
Shiro加密特性简介
-
接口驱动,基于
POJO:Shiro的所有API都是基于接口的,且作为POJO实现,这允许使用JavaBeans兼容的配置方式来配置组件,包括这些加密组件 -
包装了JCE,使用简单:
Java Cryptography Extension是JDK提供的加密工具包,但是它是极其难用的,除非是密码学的专家,否则应该没人愿意使用。Shiro的加密API用起来会简单很多,它们简化了JCE的概念。即使是从来没用过加密的新手,也能很快的上手 -
面向对象的实现:
JCE包中的类是抽象类,极其具有迷惑性。它需要你先使用一个类型不安全的工厂方法产生一个实例,然后才能通过这个实例进行加密。Shiro则是通过面向对象的概念形成了一个清晰的结构 -
运行时异常:多有的加密异常都是以
RuntimeException的形式抛出的,这不会强制要求你捕获这些异常进行处理
Cipher的特性
-
OO架构:和
JCE不同,Shiro的Cipher是以面向对象的类层次结构来实现的,如:AbstractSymmetricCipherService,DefaultBolckCipherService,AesCipherSerevice等等,可以通过继承这些类来扩展需要的功能 -
实例化类来使用:
JCE是调用工厂方法来构造实例,该方法接收一个字符串参数来指定算法,从而使用这个实例来进行加密。而Shiro则可以直接实例化一个类来进行加密,如new AesCipherService() -
安全的默认配置:
JCE Cipher实例采用”最低标准“,不会自动启用更安全的选项。Shiro会自动启用更安全的选项,以确保数据安全
Hash 的特性
-
默认接口实现:Shiro提供了默认的
Hash实现,如MD5,SHA1,SHA-256等,且这些实现提供了一个类型安全的构造方式(new Md5Hash(data))而不是像JCE那样需要使用类型不安全的字符串参数的工厂方法 -
内置十六进制和Base64转换:Shiro的
Hash实现,自动提供了一个十六进制和Base64的编码方法(toHex()和toBase64()) -
内置加盐和迭代哈希的支持:盐和迭代哈希在对数据进行散列是非常有用的工具,特别是在保护用户密码的时候。Shiro的
Hash实现支持盐和多个散列迭代,因此不必在可能需要它的任何地方重复此逻辑