2019独角兽企业重金招聘Python工程师标准>>>

考虑系统密码的安全,目前大多数系统都不会把密码以明文的形式存放到数据库中。

一把会采取以下几种方式对密码进行处理

密码的存储

“编码”存储

Shiro 提供了 base64和 16 进制字符串编码/解码的 API支持,方便一些编码解码操作。 Shiro内部的一些数据的存储/表示都使用了 base64和 16 进制字符串。

下面两端代码分别对其进行演示

Stringstr = "hello"; Stringbase64Encoded = Base64.encodeToString(str.getBytes()); Stringstr2 = Base64.decodeToString(base64Encoded); Assert.assertEquals(str,str2);

通过如上方式可以进行 base64编码/解码操作

Stringstr = "hello"; Stringbase64Encoded = Hex.encodeToString(str.getBytes()); Stringstr2 =newString(Hex.decode(base64Encoded.getBytes())); Assert.assertEquals(str,str2);

通过如上方式可以进行 16 进制字符串编码/解码操作。

Hash存储

散列算法一般用于生成数据的摘要信息,是一种不可逆的算法,一般适合存储密码之类的数据,常见的散列算法如 MD5、SHA等。一般进行散列时最好提供一个 salt(盐),比如加密密码“admin”,产生的散列值是“21232f297a57a5a743894a0e4a801fc3”,可以到一些 md5解密网站很容易的通过散列值得到密码“admin”,即如果直接对密码进行散列相对来说破解更容易,此时我们可以加一些只有系统知道的干扰数据,如用户名和 ID(即盐);这样散列的对象是“密码+用户名+ID”,这样生成的散列值相对来说更难破解。

Stringstr = "hello"; Stringsalt = "123"; Stringmd5 =new Md5Hash(str, salt).toString();//还可以转换为  toBase64()/toHex()

如上代码通过盐“123”MD5散列“hello”。另外散列时还可以指定散列次数,如 2次表示:md5(md5(str)):“new Md5Hash(str, salt, 2).toString()”

Stringstr = "hello"; Stringsalt = "123"; Stringsha1 =new Sha256Hash(str, salt).toString();

使用 SHA256 算法生成相应的散列数据,另外还有如 SHA1、SHA512算法。

Shiro 还提供了通用的散列支持:

Stringstr = "hello"; Stringsalt = "123"; //内部使用MessageDigest StringsimpleHash =new SimpleHash("SHA-1", str, salt).toString();

通过调用 SimpleHash 时指定散列算法,其内部使用了 Java的 MessageDigest 实现。为了方便使用,Shiro提供了 HashService,默认提供了 DefaultHashService实现

DefaultHashServicehashService =new DefaultHashService(); //默认算法 SHA-512 hashService.setHashAlgorithmName("SHA-512");hashService.setPrivateSalt(newSimpleByteSource("123"));//私盐,默认无hashService.setGeneratePublicSalt(true);//是否生成公盐,默认false hashService.setRandomNumberGenerator(new  SecureRandomNumberGenerator());//用于生成公盐。默认就这个hashService.setHashIterations(1);//生成 Hash 值的迭代次数HashRequestrequest =new HashRequest.Builder() .setAlgorithmName("MD5").setSource(ByteSource.Util.bytes("hello")).setSalt(ByteSource.Util.bytes("123")).setIterations(2).build();Stringhex =hashService.computeHash(request).toHex();

加密存储

Shiro 还提供对称式加密/解密算法的支持,如 AES、Blowfish等;当前还没有提供对非对称加密/解密算法支持,未来版本可能提供。

AES 算法实现:

AesCipherServiceaesCipherService =new AesCipherService(); aesCipherService.setKeySize(128);//设置 key 长度//生成 key Keykey=aesCipherService.generateNewKey(); Stringtext = "hello"; //加密StringencrptText =aesCipherService.encrypt(text.getBytes(),key.getEncoded()).toHex(); //解密Stringtext2 = newString(aesCipherService.decrypt(Hex.decode(encrptText),key.getEncoded()).getBytes()); Assert.assertEquals(text, text2);

密码的验证

使用“密码的存储”章节中其中一种存储方式存储密码之后,接下来就是登陆时密码的验证.

该过程主要涉及到两个问题:

(1)    让Shiro知道数据库中存储的密码是通过什么方式存储的?

可以在指定比较器时进行设置

(2)    让Shiro知道如何比对数据库与登录时的密码?

Shiro主要通过CredentialsMatcher的子类来实现密码的对比,Shiro已经实现了比较常见的Matcher,例如Md5CredentialsMatcher,Sha256CredentialsMatcher等等,如果Shiro提供的Matcher不能满足需求,还可以自定义Matcher.

Spring集成Shiro密码验证实例

本小节以Spring集成Shiro为基础,介绍如何使用MD5对密码进行加密,添加密码加密功能需要经过以下三步

保存密码

作为密码的数据源头,首先要确保在密码保存时就使用MD5加密

在Spring的Controller对应的方法中,使用以下方法保存密码

@RequestMapping("/setting/user/add")public String addUser(@Valid User user, BindingResult result, Map<String, Object> model,@RequestParam(value = "action") String action) {String cryptedPwd = new Md5Hash(user.getPwd()).toString();user.setPwd(cryptedPwd);userService.saveUser(user);return "redirect:/setting/user/" + user.getName();}

配置Matcher

当数据库中存的是MD5形式的密码后,就要告诉shiro如何对登陆时输入的密码进行对比,在这里采用默认的HashedCredentialsMatcher作为比较器

Shiro-config.xml配置如下

<!—在自定义的Realm中配置Matcher,并指定加密算法--><beanid="customerRealm" class="com. test.security.CustomerRealm"><propertyname="credentialsMatcher"><beanclass="org.apache.shiro.authc.credential.HashedCredentialsMatcher"><propertyname="hashAlgorithmName" value="MD5" /></bean></property></bean>

密码校验

对于CustomerRealm而言,不需要关心密码是如何被匹配的,只需要将用户输入的密码传入AuthenticationInfo对象中即可

@OverrideprotectedAuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken)throws AuthenticationException {// 获取基于用户名和密码的令牌,authcToken是从LoginController里面//currentUser.login(token)传过来的UsernamePasswordToken token = (UsernamePasswordToken) authcToken;User user = userService.findUserByName(token.getUsername());if(null != user) {AuthenticationInfo authcInfo =new SimpleAuthenticationInfo(user.getName(), user.getPwd(),user.getName());this.setSession(GCloudConstant.CURRENT_USER,user.getName());return authcInfo;}else {return null;}}

转载于:https://my.oschina.net/u/1425545/blog/543501

将 Shiro 作为应用的权限基础 五:密码的加密/解密在Spring中的应用相关推荐

  1. 将 Shiro 作为应用的权限基础

    Shiro 是 Java 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势.本文介绍了 Shiro 的 ...

  2. 将 Shiro 作为应用的权限基础 三:基于注解实现的授权认证过程

    授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限等等. 一.用户权限模型 为实现一个较为灵活的用户权限数据模 ...

  3. Word2010怎么给文档设置权限用密码进行加密防止他人查看

    前言:有时候我们想要增加Word文档的保密性,这时就可以给文档设置权限,用密码进行加密,这样就只有知道密码的人才能查看文档. 操作方法 :1.打开需加密的文档后,依次点击"文件"→ ...

  4. 一篇搞定 SpringBoot+Mybatis+Shiro 实现多角色权限管理

    初衷:我在网上想找整合springboot+mybatis+shiro并且多角色认证的博客,发现找了好久也没有找到想到的,现在自己会了,就打算写个博客分享出去,希望能帮到你. 原创不易,请点赞支持! ...

  5. spring boot结合shiro实现用户-角色-权限的控制(包含用户名密码登陆和手机号验证码登陆)

    spring boot整合shiro实现权限校验 1.首先导入项目所需jar包 <parent><groupId>org.springframework.boot</gr ...

  6. shiro、基于url权限管理、超详细

    如果需要本篇博客内容的代码!请到我的博客下载中心去下载   https://download.csdn.net/download/qq_36125138/10719559 项目运行图: 权限管理原理知 ...

  7. linux 管道来删除,Linux入门基础(五):Linux管道,重定向,文本处理

    多命令协作:管道及重定向 在Linux中,大多数命令都很简单,每个命令往往只实现一个或几个很简单功能. 我们可以通过将不同功能的命令组合起来一起使用,达到完成某个复杂功能的目的 CLI下几乎所有的命令 ...

  8. WPF基础五:UI④ 条目控件ContextMenu

    派生关系: Object->DispatcherObject->DependencyObject->Visual->UIElement->FrameworkElement ...

  9. shiro 方法级别细粒度权限控制_Shiro的认证和权限控制

    从类别上分,有两大类: - 认证:你是谁?–识别用户身份. - 授权:你能做什么?–限制用户使用的功能. 权限的控制级别 从控制级别(模型)上分: - URL级别-粗粒度 - 方法级别-细粒度 - 页 ...

最新文章

  1. OC基础--OC内存管理原则和简单实例
  2. java 8大happen-before原则超全面详解
  3. 你们都在用IntelliJ IDEA吗?或许你们需要看一下这篇博文
  4. controller如何保证当前只有一个线程执行_聊聊Spring线程安全,读完之后,大部分程序员收藏了......
  5. 白硕 | 基于区块链的众包社区激励机制
  6. 原因原来默认预检测会检测是否存在多选框
  7. webpack 编译完成执行代码
  8. 让用户感到体贴登录页设计灵感
  9. 特别困的学生(Extraordinarily Tired Students, ACM/ICPC Xi'an 2006, UVa12108)
  10. xadmin获取mysql_Django2集成xadmin详解-5-获取登录用户信息并填充相应Model字段
  11. windows安装pyspider教程
  12. Xcode 6系列百度网盘地址,包含Xcode 6.2以及Xcode 6.3
  13. 多个无线WIFI路由器之间实现不掉线无缝切换的设置方法
  14. 平替电容笔用什么品牌,最推荐的品牌
  15. 完美的word转pdf
  16. ​itools官方下载2015 v3.1.7.0 中文版
  17. wordpress添加媒体_如何在WordPress中添加jQuery FAQ手风琴
  18. 蓝桥杯—第八届—A组—第二题—跳蚱蜢 {C语言}=====【可调试】
  19. windows 8.1 安装
  20. 远程桌面连接时,用电脑名不能连接,用IP就可以,为什么

热门文章

  1. 零基础自学python的app-零基础初学Python,需要装什么软件?
  2. 使用git clone的时候报错:Received HTTP code 503 from proxy after CONNECT
  3. Linux命令scp用于远程文件的拷贝(上传和下载)
  4. UVa1377 Ruler(dfs或者bfs)
  5. (转)SSL/TLS 漏洞“受戒礼”,RC4算法关闭
  6. Linux下源码编译安装Python3
  7. 翻译 | 关键CSS和Webpack: 减少阻塞渲染的CSS的自动化解决方案
  8. 自己实现的字符串处理函数
  9. javascript黑魔法
  10. Unicode字段也有collation