[技术分享]用户密码安全存储建议

标签: 技术 分享 用户 | 发表时间:2012-01-18 16:21 | 作者:MSSecurity
出处:http://blog.csdn.net

       安全小测验:存储机密信息最安全的办法是什么?

              a)利用 256 位密钥的强对称加密算法(例如 AES)进行加密。

              b)利用 4096 位密钥的非对称强加密算法(例如 RSA)进行加密。

              c)利用平台内置的加密系统进行加密,例如 Windows 的数据保护 API (DPAPI)。

       做出选择了吗?正确的答案实际上是:

              d)既然是机密数据,就完全不要存储!

       好吧,这个问题看上去有点难,但其答案是很有道理的:窃贼无法窃取根本不存在的东西。我们把这个原则应用到身份验证操作,如网站登录。如果一个网站永远不存储用户的密码,那么即使网站受到攻击,这些密码也不能被盗走。但是网站如何在不存储用户密码的情况下来验证用户的身份呢?答案就是网站存储密码的加密哈希,而不是明文密码本身。(如果你对哈希的概念不熟悉,我们建议你在继续前阅读 http://msdn.microsoft.com/zh-cn/library/92f9ye3s.aspx#hash_values。)通过比较哈希而不是明文,网站仍然可以验证用户确实知道自己的密码,不然哈希将不会匹配,而实现这个过程并不需要网站实际存储密码(如图1所示)。这是一个不错的解决方案,但是仍有一些设计方面的注意事项,以确保你不会无意间削弱系统的强度。

       第一个设计问题是,简单地对密码进行哈希计算并不能提供充分的保护:你还需要在计算哈希值前为每个密码添加随机盐值(Salt)。切记,对于给定的哈希函数,对某个输入值计算哈希值始终会得到相同的输出值。如果时间充裕,攻击者可能会计算出明文字符串及其相应哈希值的表。事实上,已经存在很多这样的表(称为“彩虹表”),并且可在互联网上免费下载。有了彩虹表后,如果攻击者通过任意方式设法获取了某网站的密码哈希列表,那么他可以使用该表轻松地确定初始的明文密码。当你对哈希加盐值时,你就可以从攻击者手中夺走这个“武器”。另外,要为每个用户生成(并存储)特定的盐值,而不是每个用户使用相同的盐值,这一点很重要。如果你始终使用相同的盐值,则攻击者可能会构建一个使用该单一盐值的彩虹表,从而提取出密码。

 

clip_image002[4]                 

图 1:比较加盐值后的哈希值

        另一个重要的设计问题是,一定要使用强加密哈希算法。MD5 可能是比较常见的选择,但是密码学家已经论证了 MD5 的脆弱性,近年来它一直被认为是不安全且“可破解”的算法。SHA-1 安全性稍微强一些,但它也开始显现被破解的迹象,现在密码学家建议避免使用 SHA-1。SHA-2 哈希算法系列当前被视为最强健的算法,是唯一获得微软安全开发生命周期 (SDL) 加密标准策略批准,可以在微软产品中使用的哈希算法系列。

       相比将SHA-2硬编码入程序,一个更好的办法是实施 “加密灵活性”,就是说即使应用程序已经部署到生产中,也仍然可以改变哈希算法。毕竟,加密算法会过时;密码学家会发现其弱点,并且随着计算能力的增强,使用暴力攻击破解越来越轻松可行。某一天,SHA-2 可能会被认为和 MD5 一样脆弱,未雨绸缪不失为明智的选择。对哈希灵活性进行深入分析讨论已经超出了本篇博文的讨论范围,不过,你可以在 MSDN 杂志文章“加密灵活性”[ http://msdn.microsoft.com/zh-cn/magazine/ee321570.aspx] 中阅读了解关于建议解决办法的更多信息。就像 SDL 强制在微软产品中使用强加密算法一样,它也鼓励产品团队尽可能使用加密灵活性,这样可以在当前强算法遭到破解的情况下更敏捷地迁移到新算法。

       到目前为止,我们已经讨论了要对 哪些内容进行哈希计算(密码和随机的特定盐值)以及 如何进行哈希计算(使用 SHA-2 系列中的加密强哈希算法,最好是可配置的,以便允许进行未来变更),但是我们还没有讨论哈希计算的 应用位置。你可能会认为在客户端执行哈希计算将能极大地提高安全性,因为你只需要通过网络向服务器发送哈希,而绝不会发送明文密码本身。不过,好处也并不像你想象的那么多。如果攻击者能够嗅探网络流量,他仍然可以拦截传输,并自行将哈希传递到服务器,从而欺骗用户,劫持其会话。这时,哈希本质上会成为明文密码。这个方法唯一切实的好处就是如果受害者在多个网站上使用同一密码,则攻击者将不能在其它网站损害受害者的帐户,因为知道密码的哈希值并不会告诉你关于密码本身的任何内容。防御此类攻击的更好方式是,在服务器端执行哈希计算,但确保密码和所有凭据令牌(例如会话 Cookie)始终通过 SSL/TLS 进行传输。在将来发布的博文中,我们会讨论安全凭据传输(和密码管理的其他方面,例如密码复杂性及其过期时间)。

       遵循下面一些简单的原则,有助于你确保应用程序的用户凭据仍保持安全,即便在数据库被攻破的情况下也是如此:

            ·始终存储并比较密码的哈希,而永远不要存储明文密码本身。

            ·在进行哈希计算前,对每个密码应用随机且特定的盐值。

            ·使用加密的强哈希算法,例如 SHA-2 系列之一。

            ·通过实施灵活的加密设计,允许未来潜在的算法变更。

            ·对服务器层进行哈希计算,并确保通过 HTTPS 传输所有密码和凭据令牌。

 

作者:Bryan Sullivan clip_image003[4]

资深安全项目经理

微软SDL(安全开发生命周期)团队

 

 

作者:MSSecurity 发表于2012-1-18 16:21:19 原文链接
阅读:7 评论:0 查看评论

相关 [技术 分享 用户] 推荐:

[技术分享]用户密码安全存储建议

- - CSDN博客推荐文章
       安全小测验:存储机密信息最安全的办法是什么.               a)利用 256 位密钥的强对称加密算法(例如 AES)进行加密.               b)利用 4096 位密钥的非对称强加密算法(例如 RSA)进行加密.               c)利用平台内置的加密系统进行加密,例如 Windows 的数据保护 API (DPAPI).

Poppen.de的技术架构分享

- - 企业架构 - ITeye博客
网址:  http://www.javabloger.com/article/couchdb-erlang-rabbitmq-red5-linux-poppen-architecture.html. Poppen.de是一个德国的 交友/ 聊天/ 视频 的SNS网站, 部分内容. NSFW,网站采用了很多我们熟悉的技术,像Nginx ,MySQL,CouchDB,Erlang,Memcached的,RabbitMQ(消息服务器),采用了Graphite作为网站的系统监控,Red5作为视频服务,Tsung作为压力测试工具,选择的技术种类较多,还采用.

超3亿活跃用户的多活架构,数据同步与流量调度怎么做? - 架构 - dbaplus社群:围绕Data、Blockchain、AiOps的企业级专业社群。技术大咖、原创干货,每天精品原创文章推送,每周线上技术分享,每月线下技术沙龙。

- -
1、OPPO多活架构原则   . 多活成本比较高的,双活是两倍,三活可能成本会低一些,但三活的难度更大. 因此没有办法对所有业务进行多活,只能对主线做多活. 举个例子,系统有个充值的功能,充值功能本身是强一致的,完全不能允许任何的延迟或者是副本的读. 但是多活切换之后,只有少数用户在切换的前几分钟有充值的,这部分用户余额可能没有通过过去,只需要对这部分用户进行服务降级,其他绝大多数用户是可以使用完整的服务的.

用户研究经验分享

- - CSDN博客互联网推荐文章
    前段时间参与了游戏用户的研究和分析,对于用户研究(以下简称用研)积累了一些经验,在此进行总结跟大家分享一下.     做任何事情之前都可以多问为什么,这个习惯可以帮助自己思考的更加全面.     在回答这个问题之前我们可以进一步思考:.     l)在什么情况下用研.     2)不同场合的用研是不是有局限性.

分享心理学:6种分享用户类型

- Draven - SocialBeta
分享是社会化媒体的一个重要特征,很多企业都已经了解了分享的重要性,不管是企业官网、博客、还是网上商城,都会摆放很多分享按钮,方便用户把内容分享到其社交圈子中去,那么,用户为什么要分享呢. 来自New York Times和Latitude Research的研究报告The Psychology of Sharing(分享心理学)为我们回答了这个问题.

海量用户网站技术经验

- - CSDN博客推荐文章
压力测试对于评估网站性能的重要性是不言而喻的,但是,无论是线下模拟的单一集群的压测,还是线上引流压测,都只是能够暴露一些基本的单点问题. 对于双十一当天高峰期的真实压力模拟,这两种传统的压力测试方式还存在着巨大偏差. 首先是业务处理链路的复杂性,对于像天猫这样的一个分布式处理平台,一笔交易的创建会涉及多个应用集群的处理,在能力评估时也应该考虑的是一个处理链路而不仅仅是单一应用集群的处理能力.

腾讯陈军:腾讯云平台与技术实践分享

- Sepher - 服务器运维与网站架构|Linux运维|互联网研究
[第三届中国云计算大会]2011年最受瞩目的IT业界盛会——第三届中国云计算大会于2011年5月18-20日在北京国家会议中心隆重举行. 本次大会由中国电子学会主办,中国电子学会云计算专家委员会、中国云计算技术与产业联盟承办,CSDN网站、《程序员》杂志和电子工业出版社协办. 5月20日,在第三节云计算大会分论坛二“云计算平台与应用实践”中,腾讯网络平台部技术总监陈军带来了主题为《腾讯云平台与技术实践》精彩演讲.

听《陌陌移动开发技术分享》有感

- - CSDN博客架构设计推荐文章
分享地址: http://www.infoq.com/cn/presentations/momo-mobile-development-technology-share. 听陌陌CTO李志威同学讲陌陌的技术发展历程,有一些启发和思考以记之. (1)前期技术选型时,尽量用业界已有的通用和成熟技术,以避免自己闭门创车和重复发明轮子,这对于一个创业团队尤为重要.

国外技术相关优秀网站分享

- - Java译站
最近翻译关注的一些博客和网站,排名不分先后. http://blog.adam-bien.com/ Adam Bien的个人博客,主要是Java&Java EE相关. http://techblog.bozho.net/ Java, Android,WEB相关. http://www.captaindebug.com/ Java, Spring, Weblogic, Oracle, MySQL等.

技术干货分享:如何选择 HTML5 游戏引擎

- - 开源中国社区最新新闻
原生手游市场已是红海,腾讯、网易等寡头独霸天下,H5游戏市场或将成为下一个风口. 据笔者所知,很多H5游戏开发团队由于选择引擎不慎导致项目甚至团队夭折. 如何选择适合团队和项目的引擎,笔者通过学习和项目实践,总结微薄经验,供大家参考,非技术人员也可以将本篇内容作为引擎选择的重要关注点. 选择H5游戏引擎的思考维度.