程序员之👀

导航

对网络安全性和apache shiro的一些认识

Posted on 2013-03-24 11:36  ^阿福^  阅读(1688)  评论(0编辑  收藏  举报

更多信息,请参考:http://www.cxyeye.com/

Apache Shiro 是什么?

Shiro 是一个强大易用的Java安全框架,提供了认证、授权、加密和会话管理功能,可为任何应用提供安全保障

为什么要使用它?

1:登陆验证是WEB应用中非常常见的一个功能;

2:对于授权,大部分应用停留在判断session为空跳回登录首页的阶段,正确的做法是能根据用户的较色权限,授予不同用户不同目录的访问权限;

3:客户端和服务端的数据传递,以及服务器之间的调用,敏感信息需要进行加密。目前很多应用甚至没有这个功能;

4:验证,授权,加密,最好有一个统一的平台去完成这些功能,shiro就是这样一个解决方案;你可以自己去实现这些功能,但有成熟的开源的产品为什么不用呢?

Apache Shiro 的一些核心思想

1:配置文件定义的内容

[main] 
ds = com.mysql.jdbc.jdbc2.optional.MysqlDataSource
ds.serverName = 127.0.0.1
ds.user = root
ds.password = root
ds.databaseName = test
ds.url = jdbc:mysql://127.0.0.1:3306/test
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.permissionsLookupEnabled = true
jdbcRealm.authenticationQuery = SELECT password FROM ho_user WHERE name = ?
jdbcRealm.userRolesQuery = SELECT role FROM ho_user WHERE name = ?
jdbcRealm.permissionsQuery = SELECT permission FROM ho_user WHERE name = ?
jdbcRealm.dataSource = $ds

authc.loginUrl = /common/login.jsp
perms.unauthorizedUrl = /common/login.jsp
roles.unauthorizedUrl = /common/login.jsp

[urls]
/action/* = authc
/admin/**=authc,perms[high]
/system/**=authc,perms[high] 

每个框架都会有自己的一些配置文件,shiro的配置是基于key-value。

1:定义验证用户的SQL

2:定义获取用户角色的SQL

3:定义获取用户权限的SQL

4:定义验证不通过时返回的页面

5:定义需要授权的目录以及授权条件

2验证用户登陆的异常思想

try {
    currentUser.login(token);
} catch (IncorrectCredentialsException ice) {
    …
} catch (LockedAccountException lae) {
    …
}
…
catch (AuthenticationException ae) {…
}

通过异常机制判断用户的验证结果

3:哈希和加密的简单实用,哈希和加密用于确保数据传输过程中对敏感数据的保护。当保护需要转换回来时需要用加密,反之用哈希;保护不仅对字符有效,对文件二进制的数据一样有效。

哈希是不可逆的,哈希的结果长度无关跟原值无关 (例如文件的哈希)

String hex = new Md5Hash(myFile).toHex();

加密是可逆的;加密随着原值长度线性增长。

AesCipherService cipherService = new AesCipherService();
cipherService.setKeySize(256);
//创建一个测试密钥: 
byte[] testKey = cipherService.generateNewKey();
//加密文件的字节: 
byte[] encrypted = cipherService.encrypt(fileBytes, testKey);

4: web支持(一般框架都是接触这种方式,servlet或者filter

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>
         org.apache.shiro.web.servlet.IniShiroFilter
    </filter-class>
    <!-- 没有init-param属性就表示从classpath:shiro.ini装入INI配置 --> 
</filter>
<filter-mapping>
    <filter-name>ShiroFilter</filter-name>
    <url-pattern>/*</url-pattern> 
</filter-mapping>

有一点可贵的是,shiro的会话管理,它可以在系统的任何位置,通过工厂的方式,得到当前对话的session

Session session = subject.getSession();

session.getAttribute("key", someValue); 

总结

Shiro为解决下列问题(我喜欢称它们为应用安全的四要素)提供了保护应用的API:

认证 - 用户身份识别,常被称为用户“登录”;

授权 - 访问控制;

密码加密 - 保护或隐藏数据防止被偷窥;

会话管理 - 每用户相关的时间敏感的状态

以下是对安全性的一些认识:

1:目录是否有严格的访问限制

2:验证码是否符合标准,会话超时时间,注销session的清空,登录用户暴力测试的锁定;

3:用户名,密码等敏感信息的HTTPS 加密传输

4:文件上传下载的 类型限制;目录限制安全

5:系统配置文件,日志安全

摘录:

让Apache Shiro保护你的应用 http://www.infoq.com/cn/articles/apache-shiro

Apache Shiro在Web中的应用 http://blog.csdn.net/stuqbx/article/details/7178406

apache shiro 管理用户权限与数据库交互 http://www.open-open.com/doc/view/453bc4f22d83435ab2bfb6768c41ac90

Apache Shiro 使用手册 http://www.open-open.com/doc/view/8cf6f10a10d0497cbcbc3a9931354c62

更多信息,请参考:http://www.cxyeye.com/

程序员之👀