一篇很不错的进行加密的文章!from: http://www.oschina.net/news/52976/hashing-or-encrypt对于网站来说, 再没有什么比用户信息泄露更让人尴尬的了。 尤其是当存有用户密码的文件如果被黑客获取, 对网站的安全和用户的信心来说都是巨大的打击。 如最近的Ebay泄密事件和小米的用户数据泄露事件。 保证用户信息安全首先需要正确理解对于用户密码的安全控制和保护。 这里OWASP的主席Michael Coates最近的一篇关于一些基本概念的介绍能够帮助开发人员更好的理解现代Hashing算法和加密对于用户密码保护的作用。 安全牛编译如下:在过去几个月, 我们看到了一些严重的数据泄露事件, Ebay和Adobe的数据泄露事件影响了几百万用户。 Snapchat也遭受到了数据泄露事件的影响。 每一次密码泄露事件后, 人们都会问同一个问题, 这些密码的存储是不是安全? 不幸的是, 这个看上去简单的问题其实并不好回答。尽管在很多情况下, Hashing和加密都能够满足安全存储的需要, 对于在线应用而言, 很多情况下, 对于用户密码的安全存储往往只有一种正确的方案。 Hashing.是通过一个不可逆的杂凑函数计算出一个Hash值, 而通过这个值无法逆向计算出输入值(比如用户密码)。 对称加密则是采用密钥进行加密计算, 这是一种可逆的运算。 任何人如果有了密钥, 就能够解密出原始明文。下表是Hashing和对称加密的对比Hashing对称加密不可逆函数可逆运算能够逆向算出初始值不能可以对于现代杂凑算法而言, 从Hash值逆向算出输入值非常困难。 参见下面关于彩虹表,盐化等的讨论对称加密就是设计来是的任何拥有密钥的人能够解密出原始明文其他需要考虑的方面杂凑算法的选择加密算法的选择对每个用户进行盐化保护密钥显示第 1 至 6 项结果,共 6 项当在线应用收到一个用户名和一个密码后, 就以密码为输入到杂凑函数中去得出一个Hash值, 然后用这个Hash值与数据库中存储的该用户的密码Hash值做比较, 如果两个Hash值相同, 就可以认为用户提供了有效的用户名和密码。 采用Hashing的好处是, 应用不需要存储用户的明文密码, 只需要存储Hash值。在线应用如何利用密码的Hash值来认证用户下图就是关于采用Hashing方式的简单描述:那么, 所有杂凑算法都能用吗? 不是的, 事实上, 杂凑算法中不同的算法的差别很大, 并不是所有的杂凑算法都适合存储密码。说起来可能有点出人预料, 早期的杂凑算法速度过快, 黑客们尽管不能通过Hash值逆向计算出原输入值, 但是黑客们可以通过暴力破解的方式遍历所有可能的密码组合来尝试能够能够“碰撞”到用户密码的Hash值。 为了避免这种威胁, 现代的杂凑算法能够通过多重迭代, 使得在每次Hash计算时产生一些延时, 对单次Hash计算, 这样的延时基本没有任何影响, 而对于黑客的暴力破解来说, 几百万次计算的延时能够被放大几百年, 这样到使得暴力破解基本不现实的地步。在Hashing中, 最好采用针对每个用户的盐化方式, 通过对用户密码添加一个随机字符串(随机字符串可以是显式存储), 这样可以相同的密码产生相同的Hash值, 这样, 攻击者可以下载一个巨大的存有事先计算好Hash值的查找表, 也叫做彩虹表。 通过Hash值, 反向查找对应的输入值。而通过下面两个表格可以看出, 通过对不同用户进行不同的盐化, 同样的密码就会出现不同的Hash值, 这样使得攻击者利用彩虹表进行攻击变得困难。没有盐化用户名密码Hash值Joepassword123xyfkdl323...Suepassword123xyfkdl323...**盐化后**用户名密码盐化字符串Hash值Joepassword12348a023jl2…ied390fl2...Suepassword1239fh3ls321…40akdl23…**类似于账户锁定的机制对于密码存储的模式有什么影响吗?**简单的回答, 就是, 没有影响。 对密码的安全存储是为了提供在密码文件被盗取后的防护。 黑客对于密码Hash的攻击是一种离线攻击。 也就是说, 密码文件已经被盗取, 黑客可以利用自己的计算机通过尝试不同的密码来找出密码。 由于是离线攻击, 账号锁定或者验证码之类的安全机制已经没有作用了。 这些机制只有在针对网站服务器的在线登录页面攻击时才会起作用。对于密码存储, 采用对称加密而不是Hashing的风险在哪里?对称加密的设计就是一个可逆的运算, 这意味着在线应用必须能够访问到密钥, 并且在每次密码验证时都要使用。 如果加密后的密码被窃取的话, 黑客需要获取对称加密的密钥, 而一旦密钥被破解出来, 不管是通过某种方式泄露出来, 或者一些弱的密钥被暴力方式破解出来, 所有的密码都会被黑客获得。总结对于密码的安全存储来说, 理解对称加密与Hashing的区别非常重要。 一些如PBKDF2, bcrypt以及scrypt等算法都采用的每用户盐化以及多重迭代的Hashing方式以安全存储密码。互联网已经日益成为重要的用户信息存储的场所。 网站开发人员及网站老板们需要尽其所能地保证用户信息的安全。 了解如何利用现代的Hashing算法对用户密码进行基本的安全控制保护非常重要。
GistBox 提供一种漂亮的方式来组织代码片段。将你的库保存到云端进行备份,再也不用担心丢失。GistBox采用标准的HTML5技术构建。GistBox使用GitHub的后端,但增加了自己的标签和搜索功能层。使用Github账号登陆Gistbox可以将你的代码直接同步进来,反过来,你在GB上的所有改动也都会同步到Github上;GistBox的结构设 计清晰,从左至右分别是主导航(新建Gist,Gists入口,收藏入口-Labels)、Gists列表(Public/Private)、具体代码 区,亲们可以用Label给代码加上各种分辨标签,方便分类整理,在检索代码时可以用顶部的搜索栏,输入关键词或Label可以更快的搜索到目标代码。网址: http://www.gistboxapp.com/
from: http://it.deepinmind.com/java/2014/05/21/better-java.htmlJava是最流行的编程语言之一,但似乎并没有人喜欢使用它。好吧,实际上Java是一门还不错的编程语言,由于最近Java 8发布了,我决定来编辑一个如何能更好地使用Java的列表,这里面包括一些库,实践技巧以及工具。这篇文章在GitHub上也有。你可以随时在上面贡献或者添加你自己的Java使用技巧或者最佳实践。编码风格结构体* builder模式依赖注入避免null值不可变避免过多的工具类格式* 文档Stream部署框架Maven* 依赖收敛持续集成Maven仓储配置管理库遗失的特性* Apache CommonsGuavaGsonJava TuplesJoda-TimeLombokPlay frameworkSLF4JjOOQ测试jUnit 4jMockAssertJ工具IntelliJ IDEA* ChrononJRebel校验框架Eclipse Memory Analyzer资源书籍播客编码风格传统的Java编码方式是非常啰嗦的企业级JavaBean的风格。新的风格更简洁准确,对眼睛也更好。结构体我们这些码农干的最简单的事情就是传递数据了。传统的方式就是定义一个JavaBean:public class DataHolder { private String data;public DataHolder() {}public void setData(String data) { this.data = data;}public String getData() { return this.data;}}这不仅拖沓而且浪费。尽管你的IDE可以自动地生成这个,但这还是浪费。因此,[不要这么写](http://www.javapractices.com/topic/TopicAction.do?Id=84)。相反的,我更喜欢C的结构体的风格,写出来的类只是包装数据:public class DataHolder { public final String data;public DataHolder(String data) { this.data = data;}}这样写减少了一半的代码。不仅如此,除非你继承它,不然这个类是不可变的,由于它是不可变的,因此推断它的值就简单多了。如果你存储的是Map或者List这些可以容易被修改的数据,你可以使用ImmutableMap或者ImmutableList,这个在不可变性这节中会有讨论。Builder模式如果你有一个相对复杂的对象,可以考虑下Builder模式。你在对象里边创建一个子类,用来构造你的这个对象。它使用的是可修改的状态,但一旦你调用了build方法,它会生成一个不可变对象。想象一下我们有一个非常复杂的对象DataHolder。它的构造器看起来应该是这样的:public class ComplicatedDataHolder { public final String data; public final int num; // lots more fields and a constructorpublic class Builder { private String data; private int num; public Builder data(String data) { this.data = data; return this; } public Builder num(int num) { this.num = num; return this; } public ComplicatedDataHolder build() { return new ComplicatedDataHolder(data, num); // etc }}}现在你可以使用它了:final ComplicatedDataHolder cdh = new ComplicatedDataHolder.Builder() .data("set this") .num(523) .build();关于Builder的使用[这里](http://en.deepinmind.com/blog/2014/05/21/the-builder-pattern-in-practice.html)还有些更好的例子,我这里举的例子只是想让你大概感受一下。当然这会产生许多我们希望避免的样板代码,不过好处就是你有了一个不可变对象以及一个连贯接口。依赖注入这更像是一个软件工程的章节而不是Java的,写出可测的软件的一个最佳方式就是使用依赖注入(Dependency injection,DI)。由于Java强烈鼓励使用面向对象设计 ,因此想写出可测性强的软件,你需要使用DI。在Java中,这个通常都是用Spring框架来完成的。它有一个基于XML配置的绑定方式,并且仍然相当流行。重要的一点是你不要因为它的基于XML的配置格式而过度使用它了。在XML中应该没有任何的逻辑和控制结构。它只应该是依赖注入。还有一个不错的方式是使用Dagger库以及Google的Guice。它们并没有使用Spring的XML配置文件的格式,而是将注入的逻辑放到了注解和代码里。避免null值如果有可能的话尽量避免使用null值。你可以返回一个空的集合,但不要返回null集合。如果你准备使用null的话,考虑一下@Nullable注解。IntelliJ IDEA对于@Nullable注解有内建的支持。如果你使用的是Java 8的话,可以考虑下新的Optional类型。如果一个值可能存在也可能不存在,把它封装到Optional类里面,就像这样:public class FooWidget { private final String data; private final Optional<Bar> bar;public FooWidget(String data) { this(data, Optional.empty());}public FooWidget(String data, Optional<Bar> bar) { this.data = data; this.bar = bar;}public Optional<Bar> getBar() {…
from: http://zhuanlan.zhihu.com/wooyun/19747591作者:园长 (@mm yz)攻击JavaWeb应用[1]-JavaEE 基础攻击JavaWeb应用[2]-CS交互安全攻击JavaWeb应用[3]-SQL注入[1]攻击JavaWeb应用[4]-SQL注入[2]攻击JavaWeb应用[5]-MVC安全攻击JavaWeb应用[6]-程序架构与代码审计攻击JavaWeb应用[7]-Server篇[1]攻击JavaWeb应用[8]-后门篇攻击JavaWeb应用[9]-Server篇[2]
整理了下做的一个笔记软件,以开放开源的态度做的.jnote是一个开源的笔记软件,类似于Evernote,wiz,麦库,界面也是参考他们做的.当初做只是为了做一个自己可以定制的笔记软件.目前完成的功能:1.新建日记,参考wiz的日记功能,这个功能很实用,可以按照年月分类.2.新建笔记,是一个笔记软件最基本的功能.3.编辑支持高级html编辑器 简单html编辑器 markdown编辑器4.分类支持无限级分类5.简单搜索6.缩小到托盘7.支持多标签8.支持笔记阅读模式9.阅读模式是可以和wiz一样,定义阅读的主题.以后的计划1.添加标签功能2.添加附件功能3.搜索功能加强,计划采用lucene,使用OSChina 网站的全文搜索框架源码做了测试,完成可以使用.4.同步,在选择上面,测试过dropbox的api,计划使用dropbox.5.和evernote 有道 麦库打通api接口,这个还没有测试过,evernote应该是首选.6.用户登录,头像…7.跨平台8…….目前存在的问题1.笔记字数,使用sqlite数据库,存储的文字多少还存在考量.2.编辑器还不完美,编辑器的切换还对笔记的格式存在转换问题.3.内嵌浏览器的问题,这个是java的硬伤,目前使用IE内核,Webkit 由于不支持linux就放弃了,打算使用JF X的内嵌浏览器来实现,提高性能和解决跨平台的问题.4……采用的技术1.界面使用BeautyEye,界面很漂亮2.nutzDao,小巧灵活.3.数据库使用sqlite,4.编辑器使用ueditor wysihtml5 pagedown做笔记软件真不容易,特别还是用java来做.在13年3月份差不多已经这个样子了,之后在忙其他事情,有时间就会继续完善的.看几张截图来看看.项目地址:http://git.oschina.net/imzhpe/jnote
解决struts2最新s2-016代码执行漏洞–CVE-2013-2251今天接到外界报告struts2框架存在任意命令执行漏洞,可直接执行任意系统命令。 详细见官方说明:http://struts.apache.org/release/2.3.x/docs/s2-016.html漏洞版本:Apache Struts 2.0.0 - Apache Struts 2.3.15漏洞描述:CVE-2013-225. Struts2 是第二代基于Model-View-Controller (MVC)模型的java企业级web应用框架。它是WebWork和Struts社区合并后的产物Apache Struts2的action:、redirect:和redirectAction:前缀参数在实现其功能的过程中使用了Ognl表达式,并将用户通过URL提交的内容拼接入Ognl表达式中,从而造成攻击者可以通过构造恶意URL来执行任意Java代码,进而可执行任意命令redirect:和redirectAction:此两项前缀为Struts默认开启功能,目前Struts 2.3.15.1以下版本均存在此漏洞目前Apache Struts2已经在2.3.15.1中修补了这一漏洞。强烈建议Apache Struts2用户检查您是否受此问题影响,并尽快升级到最新版本<_ 参考 1. http://struts.apache.org/release/2.3.x/docs/s2-016.html _>测试方法:@Sebug.net dis 本站提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!由于Apache Struts2 在最新修补版本2.3.15.1中已经禁用了重定向参数,因此只要重定向功能仍然有效,则说明受此漏洞影响:http://host/struts2-showcase/employee/save.action?redirect:http://www.yahoo.com/如果页面重定向到www.yahoo.com,则表明当前系统受此漏洞影响。验证表达式解析和命令执行:http://host/struts2-showcase/employee/save.action?redirect:%25{3*4}http://host/struts2-showcase/employee/save.action?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}`Sebug安全建议:厂商状态:厂商已经发布Apache Struts 2.3.15.1以修复此安全漏洞,建议Struts用户及时升级到最新版本。厂商安全公告:S2-01. 链接:http://struts.apache.org/release/2.3.x/docs/s2-016.html软件升级页面:http://struts.apache.org/download.cgi#struts23151目前存在漏洞的公司乌云上,已经发布了快60个struts的这个漏洞问题,包括腾讯,百度,网易,京东等国内各大互联网公司。(http://www.wooyun.org/bugs/new_submit/) 解决办法:升级到Struts 2.3.15.1(强烈建议)使用ServletFilter来过滤有问题的参数(临时替换方案) 参考资料:http://sebug.net/appdir/Apache%20Struts这次struts爆出来的漏洞,一大片的网站受的影响,影响最严重的就是电商了. 对于struts的漏洞,曾经也写过struts2代码执行漏洞,struts2自从使用OGNL表达式的方式后,经常就会报出一些可怕的漏洞出来,建议那些还是struts的童鞋们,学习一些其他的框架吧!比如,spring mvc,简单,好用,高效! 这里有篇对struts漏洞分析很透彻的文章,推荐学习学习. http://www.inbreak.net/archives/507