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
实现支持盐和多个散列迭代,因此不必在可能需要它的任何地方重复此逻辑