文档章节

shiro之编码加密

沉默的懒猫
 沉默的懒猫
发布于 2016/07/07 16:23
字数 631
阅读 859
收藏 9

一、Shiro 提供了base64和16进制字符串编码/解码的API支持:

	    String str = "h";
		//base64 编码
		String base64Encoded = Base64.encodeToString(str.getBytes());
		//base64 编码解码
		String str2 = Base64.decodeToString(base64Encoded);
		System.out.println(str.equals(str2));
		
		String str3 = "y";
		//16进制字符串编码
		String hexEncoded = Hex.encodeToString(str3.getBytes());
		//16进制字符串解码
		String str4 = new String(Hex.decode(hexEncoded));
		System.out.println(str3.equals(str4));
		//byte数组与String转换
		CodecSupport.toBytes(str, "utf-8");
		CodecSupport.toString(str.getBytes(), "utf-8");

二、散列算法

散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如MD5、SHA等。

        String str = "h";
		String salt = "123"; //盐
		//单纯md5加密,易破解
		System.out.println(new Md5Hash(str).toString());
		//加干扰数据,即盐
		System.out.println(new Md5Hash(str,salt).toString());
		//指定散列次数,如2次::md5(md5(str))
		System.out.println(new Md5Hash(str,salt,2).toString());
		//SHA256 算法 还有如SHA1、SHA512算法
		System.out.println(new Sha256Hash(str,salt).toString());
		//shiro通用散列支持,内部使用了Java 的MessageDigest实现
		System.out.println(new SimpleHash("md5",str,salt).toString());

Shiro 提供了HashService,默认提供了DefaultHashService实现

        //创建一个DefaultHashService,默认使用SHA-512 算法;
		DefaultHashService hashService = new DefaultHashService();
		//修改算法
		hashService.setHashAlgorithmName("md5");
		//设置一个私盐,其在散列时自动与用户传入的公盐混合产生一个新盐
		hashService.setPrivateSalt(new SimpleByteSource("123"));
		//在用户没有传入公盐的情况下是否生成公盐,默认false
		hashService.setGeneratePublicSalt(true);
		//用于生成公盐
		hashService.setRandomNumberGenerator(new SecureRandomNumberGenerator());
		//修改默认加密迭代次数
		hashService.setHashIterations(2);
		//构建一个HashRequest,传入算法、数据、公盐、迭代次数。
		HashRequest request = new HashRequest.Builder().setAlgorithmName("md5")
				.setSource(ByteSource.Util.bytes("h"))
				.setSalt(ByteSource.Util.bytes("123"))
				.setIterations(2).build();
		System.out.println(hashService.computeHash(request).toString());
		
		//SecureRandomNumberGenerator用于生成一个随机数
		SecureRandomNumberGenerator srng = new SecureRandomNumberGenerator();
		srng.setSeed("123".getBytes());
		System.out.println(srng.nextBytes().toHex());

三、加密、解密

Shiro 还提供对称式加密/解密算法的支持,如AES、Blowfish 等

        //AES算法
		AesCipherService acs = new AesCipherService();
		acs.setKeySize(128);//key长度
		Key key = acs.generateNewKey();//生成key
		String str = "h";
		//加密
		String encrptText = acs.encrypt(str.getBytes(), key.getEncoded()).toHex();
		System.out.println(encrptText);
		//解密
		String str2 = new String(acs.decrypt(Hex.decode(encrptText), key.getEncoded()).getBytes());
		System.out.println(str2);

四、PasswordService/CredentialsMatcher

Shiro 提供了PasswordService及CredentialsMatcher用于提供加密密码及验证密码服务。

public interface PasswordService {
//输入明文密码得到密文密码
String encryptPassword(Object plaintextPassword) throws IllegalArgumentException;
}
public interface CredentialsMatcher {
//匹配用户输入的token 的凭证(未加密)与系统提供的凭证(已加密)
boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info);
}

Shiro 默认提供了PasswordService 实现DefaultPasswordService;CredentialsMatcher 实现PasswordMatcher及HashedCredentialsMatcher

简单使用:

service层加密密码保存到数据库

//加密密码
user.setPassword(passwordService.encryptPassword(user.getPassword()));

登录时realm验证

SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
				account,user.getPassword(),this.getName());
		System.out.println("匹配=>"+credentialsMatcher.doCredentialsMatch(token,authenticationInfo));
		if( !credentialsMatcher.doCredentialsMatch(token,authenticationInfo)){
			throw new IncorrectCredentialsException();
		}

 

© 著作权归作者所有

沉默的懒猫
粉丝 9
博文 103
码字总数 81208
作品 0
海淀
程序员
私信 提问
加载中

评论(1)

DK47
DK47
d
将 Shiro 作为应用的权限基础 五:密码的加密/解密在Spring中的应用

考虑系统密码的安全,目前大多数系统都不会把密码以明文的形式存放到数据库中。 一把会采取以下几种方式对密码进行处理 密码的存储 “编码”存储 Shiro 提供了 base64和 16 进制字符串编码/...

有资本再款
2015/12/13
564
0
请教一个关于shiro的问题

@黄勇 你好,想跟你请教个问题: 关于shiro或者同类型的安全框架一直有一个疑问,就是为什么不能通过用普通的拦截器来实现安全管理呢,比如自己写一个sessionFilter,然后通过查询在数据库关...

Kent_Chen
2014/04/09
164
1
跟开涛老师学shiro -- 编码/加密

在涉及到密码存储问题上,应该加密/生成密码摘要存储,而不是存储明文密码。比如之前的600w csdn账号泄露对用户可能造成很大损失,因此应加密/生成不可逆的摘要方式存储。 5.1 编码/解码 Sh...

文艺小青年
2017/07/06
0
0
让Apache Shiro保护你的应用

什么是Apache Shiro? Apache Shiro(发音为“shee-roh”,日语“堡垒(Castle)”的意思)是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可为任何应用提供安全保障...

heroShane
2014/02/09
917
0
让Apache Shiro保护你的应用[转]

尝试保护你的应用时,你是否有过挫败感?是否觉得现有的Java安全解决方案难以使用,只会让你更糊涂?本文介绍的Apache Shiro,是一个不同寻常的Java安全框架,为保护应用提供了简单而强大的方...

hhs
2011/05/27
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

手持式人证核验设备助力国家安全系统

手持式人证核验设备,是针对公共安全领域的移动化身份核验、追逃等需求推出的手持式一体化设备。其特点是具备人员信息采集、存储和比对功能,将采集到的人脸信息与居民身份证芯片中的人脸信息...

非思丸智能FaceTo
10分钟前
2
0
好程序员web前端教程分享JavaScript简写方法

今天好程序员web前端教程为大家分享JavaScript简写方法,小伙伴们快来看一看吧。 1.三元操作符 当想写if...else语句时,使用三元操作符来代替。 constx =20; let answer; if(x >10) { answer...

好程序员官网
14分钟前
3
0
PHP面试题2019年小米工程师面试题和答案解析

一、单选题(共29题,每题5分) 1.PHP面向对象方法重写描述错误的是? A、子类必须继承父类 B、子类可以重写父类已有方法 C、重写之后子类会调用父类方法 D、子类也可以具有与父类同名的属性...

一个PHP程序媛
18分钟前
2
0
K8s 从懵圈到熟练 – 镜像拉取这件小事

导读:相比 K8s 集群的其他功能,私有镜像的自动拉取,看起来可能是比较简单的。而镜像拉取失败,大多数情况下都和权限有关。所以,在处理相关问题的时候,我们往往会轻松的说:这问题很简单...

Mr_zebra
18分钟前
3
0
分布式锁简单入门以及实现方法

学过Java多线程的应该都知道什么是锁,没学过的也不用担心,Java中的锁可以简单的理解为多线程情况下访问临界资源的一种线程同步机制。 在学习或者使用Java的过程中进程会遇到各种各样的锁的...

yanlijun_java
21分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部