摄影

安全存储密码:Hashing 还是加密?

一篇很不错的进行加密的文章!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算法对用户密码进行基本的安全控制保护非常重要。

如何提高设计 API 的能力?

from: http://z.ihu.im/u/BZp(71、依赖倒置原则依赖倒置的意思,是不要想象别人应该怎么用你的API、以及用你的API做什么;而是“倒”过来想,我的API对外提供了一个什么样的抽象、这个抽象是否够好、够简洁,有没有把不必要的细节暴露给用户。比如说,之前我所在的公司做了个类似电子商城的东西,其它项目组做出产品,就放在这个商城里面销售。那个商城团队就犯了干涉他人实现的大忌:他们非要了解其他项目组的逻辑,才知道如何才能把别人的产品上架销售。不要这样。这种做法就导致两个团队耦合过重;且新产品和老产品逻辑无法兼容、甚至因为修改逻辑去迎合新产品,导致老产品销售逻辑出现问题——又因为怕老产品出现问题,于是不得不逼新产品去适应老产品的流程,而不管两者差别有多大。这就导致,我们经常花1个月实现了一个新产品;为了把它上架却经常需要3个月甚至超过半年——并且,商城团队和其它项目团队都必须加班、修改逻辑,甚至经常因为商城方提出的诡异逻辑/需求而出现摩擦(这伙人傻的……我都忍不住发过几次火……实在看不下去,我就给了一个方案,要求商城团队修改。这个方案基于依赖倒置原则,要求商城对外提供一个商品的抽象;商品的定义是有名字有价格、通过销售转移所有权的逻辑实体。如此一来,任何项目想要上架,只要给自己起个名字、定个价格、用html或某种富文本格式或商城项目组喜欢的任何格式提供一段商品介绍、最后再提供一个“所有权成功转移给xx用户”的回调接口即可。双方从此再不需要哪怕一个字的交流。这个接口可以永远不修改哪怕一个字节,足以支持任何商品种类的交易。(事实上,我们团队就是按这个要求写程序的。写完再和商城团队扯皮。这可以避免他们动辄增加的猪逻辑/需求影响到我们的内部结构:随便他们要什么,我们都可以弄个空逻辑或者不同商品规格搪塞过去)但商城团队觉得一旦做成这样,他们以后就没事可干了,所以拒绝修改……好在,后来他们集体辞职了。——如果你的接口不能稳定,那么你一定违反了依赖倒置原则,或者是做了一个超烂的抽象。——至于什么叫好抽象,请参考KISS原则2、完整且最小原则完整,就是接口的功能要完整,该有的功能必须有;最小,是接口功能没有冗余,不要接口A提供的功能,用一点外部逻辑再加上接口B或者接口B+接口C也能实现。当然,这是一个比较理想化的指标。某些时候,为了易用性或者性能,是可以甚至必须做一些更简单、方便、易用,但加起来却不是最简的接口的。但,这个完整且最小的接口必须找出来。它是一切的基础,也体现了开发者是否已经做出了一个清晰的抽象。有了它,其它可以以后慢慢补;但如果没有这个基础,什么易用、简洁,都不过是扯淡。我宁可用一个繁琐、难用、难理解,但可保证不变的接口,也不想碰做点简单的活计非常方便、易用,但根本没法实现稍难的需求、并且不能保证稳定的接口。事实上,两者的差别就在于有没有好的抽象;而一旦有了好的抽象,哪怕想做得繁琐、难用、难理解,都不是容易的事。总结:有了好的抽象,接口才可能稳定;然后找出完整且最小的接口,那么只要抽象不变,这个接口就绝对稳定;最后,在这个基础之上,做出易用、易理解的接口。

如何写出更好的Java代码

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&lt;Bar&gt; bar) { this.data = data; this.bar = bar;}public Optional&lt;Bar&gt; getBar() {…

程序猿学黑客 · Java WEB 安全系列课程

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]

Chrome渲染Transition时页面闪动Bug

from

iconfont.cn 阿里出品的矢量图标库

Iconfont.cn是阿里巴巴推出的矢量图标库,其中涵盖了1000多个常用图标,并在持续更新中。(目前已有7000+图标,部分图标为用户上传,因此默认不公开,但是可以搜索到。)&nbsp;Iconfont提供以下功能:在线图标搜索图标分捡下载在线储存矢量格式转换图标库管理iconfont的优势自由变化大小(高清屏无压力)自由修改颜色(纯色)可以添加一些视觉效果如:阴影、旋转、透明度iconfont使用声明字体@font-face {font-family: ‘iconfont’;src: url(‘iconfont.eot’); /* IE9*/src: url(‘iconfont.eot?#iefix’) format(‘embedded-opentype’), /* IE6-IE8 /url(‘iconfont.woff’) format(‘woff’), / chrome、firefox /url(‘iconfont.ttf’) format(‘truetype’), / chrome、firefox、opera、Safari, Android, iOS 4.2+/url(‘iconfont.svg#iconfont’) format(‘svg’); / iOS 4.1- */}`定义样式`.iconfont{font-family:"iconfont";font-size:16px;font-style:normal;}`选择图标、获取字体编码,应用于页面`<i class="iconfont">&#33</i>

新婚祝福青儿

今天是高中同学青儿的婚礼,抱歉不能参加,只能遥祝一下了。送上一段祝福!My very best wishes to you for a lifetime of happiness.  向你俩致以最美好的祝愿,祝你们终生幸福。

西安-大雁塔20121201

[AFG_gallery id=’1’]

jnote开源笔记软件

整理了下做的一个笔记软件,以开放开源的态度做的.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

千千静听的没落

千千静听更名成百度音乐,说是更名,其实也就是千千静听的一种没落吧!我是05年接触电脑的,当前XP系统一统天下,装机不是番茄就是深度或者雨林木风的ghost,在ghost上面,没有个千千静听,就认为你的ghost做的不好,电脑上面不装个千千静听,就问你,听歌咋不用千千静听,给你装个吧!千千静听最喜欢的皮肤是WMP10,记得有一次千千静听的皮肤大赛,特等奖的皮肤骂声不断,以后也没见过那个皮肤火起来过.自从06年千千静听被百度收购,之后酷狗音乐,QQ音乐等在线网络听歌的出现,千千静听在百度的大山下,却没有利用到百度在中国最大的音乐资源,就这么给没落下来了.之后,百度发力,也开始整合自己的网络资源.可这时候,已经都是酷狗音乐,QQ音乐,酷我音乐等的天下,再加上功能越来越臃肿,广告弹窗越来越多.到现在,千千静听在电脑上的存在,只能叫做”曾经听歌用千千静听”.到现在,百度各种音乐资源的整合,千千静听的更名也只能说是种没落了!最近世界之窗发布了V6,速度相当不错,不知道会不会落下一个什么样的结果了!

1 3 4 5 57