Best general-purpose digest function?

When writing an average new app in 2009, what's the most reasonable digest function to use, in terms of security and performance? (And how can I determine this in the future, as conditions change?)

When similar questions were asked previously, answers have included SHA1, SHA2, SHA-256, SHA-512, MD5, bCrypt, and Blowfish.

I realize that to a great extent, any one of these could work, if used intelligently, but I'd rather not roll a dice and pick one randomly. Thanks.


I'd follow NIST/FIPS guidelines:

March 15, 2006: The SHA-2 family of hash functions (i.e., SHA-224, SHA-256, SHA-384 and SHA-512) may be used by Federal agencies for all applications using secure hash algorithms. Federal agencies should stop using SHA-1 for digital signatures, digital time stamping and other applications that require collision resistance as soon as practical, and must use the SHA-2 family of hash functions for these applications after 2010. After 2010, Federal agencies may use SHA-1 only for the following applications: hash-based message authentication codes (HMACs); key derivation functions (KDFs); and random number generators (RNGs). Regardless of use, NIST encourages application and protocol designers to use the SHA-2 family of hash functions for all new applications and protocols.

You say "digest function"; presumably that means you want to use it to compute digests of "long" messages (not just hashing "short" "messages" like passwords). That means bCrypt and similar choices are out; they're designed to be slow to inhibit brute-force attacks on password databases. MD5 is completely broken, and SHA-0 and SHA-1 are too weakened to be good choices. Blowfish is a stream cipher (though you can run it in a mode that produces digests), so it's not such a good choice either.

That leaves several families of hash functions, including SHA-2, HAVAL, RIPEMD, WHIRLPOOL, and others. Of these, the SHA-2 family is the most thoroughly cryptanalyzed, and so it would be my recommendation for general use. I would recommend either SHA2-256 or SHA2-512 for typical applications, since those two sizes are the most common and likely to be supported in the future by SHA-3.

It really depends on what you need it for.

If you are in need of actual security, where the ability to find a collision easily would compromise your system, I would use something like SHA-256 or SHA-512 as they come heavily recommended by various agencies.

If you are in need of something that is fast, and can be used to uniquely identify something, but there are no actual security requirements (ie, an attacker wouldn't be able to do anything nasty if they found a collision) then I would use something like MD5.

MD4, MD5, and SHA-1 have been shown to be more easily breakable, in the sense of finding a collision via a birthday attack method, than expected. RIPEMD-160 is well regarded, but at only 160 bits a birthday attack needs only 2^80 operations, so it won't last forever. Whirlpool has excellent characteristics and appears the strongest of the lot, though it doesn't have the same backing as SHA-256 or SHA-512 does - in the sense that if there was a problem with SHA-256 or SHA-512 you'd be more likely to find out about it via proper channels.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

  • 建议使用什么方法来加密数据库中的用户密码?(What is the recommended way to encrypt user passwords in a database?)
    问题 在用Perl编写并使用PostgreSQL的Web应用程序中,用户具有用户名和密码。 建议使用哪种方式存储密码? 使用Perl的crypt()函数和随机盐对它们进行加密? 这将密码的有效长度限制为8个字符,并且需要提取存储的密码,以便与认证时用户给定的密码进行比较(以获取附加在密码上的盐)。 PostgreSQL中有内置的方法可以做到这一点吗? 我应该使用Digest :: MD5吗? 回答1 将SHA1或SHA256哈希与加盐配合使用。 这就是存储密码的方法。 回答2 请勿使用其他大多数人建议的SHA1或SHA256 。 绝对不要使用MD5 。 SHA1 / 256和MD5均用于创建文件和字符串(以及其他数据类型,如有必要)的校验和。 因此,它们被设计为尽可能快,以便可以快速生成校验和。 如此快速的速度使暴力破解密码变得更加容易,因为编写良好的程序可以轻松地每秒生成数千个哈希。 相反,请使用专门为密码设计的慢速算法。 它们的设计花费了更长的时间,其好处是蛮力攻击变得更加困难。 因此,密码将更加安全。 如果您一次只看一次加密单个密码,这将不会遇到任何明显的性能劣势,这是存储和检查密码的正常实现。 真正的区别仅在于散装。 我个人喜欢bcrypt。 应该有它的Perl版本,因为快速的Google搜索产生了一些可能的匹配项。 回答3 常用MD5,但SHA1 / SHA256更好。
  • 可以使用CRC32C作为基础构造一个“好的”哈希函数吗?(Can one construct a “good” hash function using CRC32C as a base?)
    问题 鉴于SSE 4.2(Intel Core i7和i5部件)包含CRC32指令,研究是否可以构建更快的通用哈希函数似乎是合理的。 据此,仅CRC32的16位均匀分布。 那么,还有哪些其他变革可以克服这一挑战呢? 更新如何? 仅16位适用于哈希值。 美好的。 如果您的表是65535或更小,那就好。 如果不是,请通过Nehalem POPCNT(填充计数)指令运行CRC值,以获取设置的位数。 然后,将其用作表数组的索引。 如果您的桌子在1mm入口以南,则此方法有效。 我敢打赌,比性能最好的哈希函数便宜/快。 既然GCC 4.5具有CRC32内在函数,那么应该很容易进行测试……如果只有我有大量的业余时间来进行处理的话。 大卫 回答1 再次访问,2014年8月由Arnaud Bouchez在最近的评论中提出,并考虑到其他答案和评论,我承认,原始答案需要更改,或者最不合格。 最后,我保留了原样以供参考。 首先,也许是最重要的一个问题的合理答案取决于哈希码的预期用途:“好” [哈希函数...]是什么意思? 哈希将在哪里/如何使用? (例如,用于散列相对较短的输入密钥吗?是否用于索引/查找目的,以生成消息摘要或其他用途?[CRC32或其衍生物的全部32位]所需的散列代码本身需要多长时间?位,更少...等等? OP提出了“更快的通用哈希函数”的问题,因此重点放在SPEED
  • SessionsHelper in railstutorial.org: Should helpers be general-purpose modules for code not needed in views?
    railstutorial.org has a suggestion which strikes me as a little odd. It suggests this code: class ApplicationController < ActionController::Base protect_from_forgery include SessionsHelper end The include SessionsHelper makes the methods available from ApplicationController, yes, but it makes them available in any view, as well. I understand that authentication/authorization is cross-cutting, but is this really the best place? That seems to me to be potentially too broad of a scope. Putting code which implements, say, a before_filter which conditionally redirects (as the railstutorial.org
  • stm32 定时器_STM32使用通用定时器做精确延时(非中断方式)
    有些时候在一个现有的工程中系统时钟被占用,用做其它功能,此时又想实现精确延时并且又不想使用中断怎么办? 以TIM4为例: void delay_us(unsigned int nus) { TIM4->CNT = nus - 1; // 向计数器装要递减的数,减到0后会触发定时器的TIM_FLAG_UpDate标志位 TIM4->CR1 |= TIM_CR1_CEN; // 使能计数器, 计数器开始递减 while((TIM4->SR & TIM_FLAG_Update) != SET); // 等到计数器减到0 TIM4-CR1 &= (~TIM_CR1_CEN); //关闭计数器 TIM4->SR &= ~TIM_FLAG_UpDate; // 清除定时器变为0的标志位 } 有了微秒延时,毫秒级延时就好办了: void delay_ms(unsigned int nms) { delay_us(nms * 1000); } 当然,定时器的初始化:注意,使用向下计数模式 TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; TIM
  • 错误:$ digest已经在进行中(Error: $digest already in progress)
    问题 尝试致电时出现此错误 function MyCtrl1($scope, $location, $rootScope) { $scope.$on('$locationChangeStart', function (event, next, current) { event.preventDefault(); var answer = confirm("Are you sure you want to leave this page?"); if (answer) { $location.url($location.url(next).hash()); $rootScope.$apply(); } }); } MyCtrl1.$inject = ['$scope', '$location', '$rootScope']; 错误是 Error: $digest already in progress 回答1 复制:防止在调用$ scope。$ apply()时发生错误$ digest。 您收到的错误表明Angular的脏检查已经在进行中。 最新的最佳实践表明,如果要在下一个摘要迭代中执行任何代码,则应使用$timeout : $timeout(function() { // the code you want to run in the next digest }); 先前的回应:
  • 指令测试中的$ apply与$ digest($apply vs $digest in directive testing)
    问题 如果我有一个指令可以响应示波器上特定属性的状态,并且我想在测试中更改该属性并验证其是否正确响应,那是进行此更改的最佳方法? 我已经看到了这两种模式: scope.$apply(function() { scope.myAttribute = true; }); 和 scope.myAttribute = true; scope.$digest(); 它们之间有什么区别,哪个更好,为什么? 回答1 scope.$digest()将在当前作用域及其所有子级上引发监视程序。 scope.$apply将评估传递的函数并运行$rootScope.$digest() 。 第一个更快,因为它需要评估观察者的当前范围及其子级。 第二个比较慢,因为它需要评估观察者的$rootScope及其所有子作用域。 当其中一个观察程序发生错误并且您使用scope.$digest ,不会通过$exceptionHandler服务处理该错误,因此您需要自己处理异常。 scope.$apply在内部使用try-catch块,并将所有异常传递给$exceptionHandler 。 回答2 正如文档本身所提到的,每次执行$scope.$apply时都会执行$scope.$apply digest循环。 根据有关范围的开发人员指南 对表达式求值后,$ apply方法执行$ digest。 在$ digest阶段
  • Lua是通用脚本语言吗?(Lua as a general-purpose scripting language?)
    问题 当我看到Lua时,我唯一读到的就是“伟大的嵌入”,“快速”,“轻巧”,而且比其他任何东西都更常见:“魔兽世界”或简而言之“ WoW”。 为什么仅限于将整个内容嵌入到另一个应用程序中? 为什么不像使用Python或Perl那样编写通用脚本? Lua在速度和内存使用(最快的脚本语言afaik)等方面似乎做得很好,为什么为什么我从来没有看到Lua被用作自动执行任务的“桌面脚本语言”? 例如: 重命名一堆文件从网上下载一些文件网页抓取 是否缺少标准库? 回答1 仅因为它已“销售”(从某种意义上来说)作为嵌入式脚本引擎的专用语言,并不意味着它仅限于此。 实际上,WoW可能还选择了Python作为其嵌入式脚本语言。 回答2 Lua是一种很酷的语言,重量轻而且非常快! 但是关键是:对于您提到的那些任务,性能是如此重要吗? 重命名一堆文件从网上下载一些文件网页抓取 您可以编写这些程序一次,然后也可以运行一次。 您为什么对一次运行的程序如此在意性能呢? 例如: 编写一个C / C ++程序需要花费3个小时,要处理一次数据,则该程序将花费1个小时来运行。 花费30分钟编写一次处理数据的Python程序,该程序将花费10个小时来运行。 如果选择第一个,则可以节省运行程序的时间,但会花费时间来开发程序。 另一方面,如果选择第二个,则会浪费时间来运行程序,但是在程序运行时您可以做其他事情。 玩魔兽世界
  • Java ME / J2ME中的SHA-256哈希函数(SHA-256 hashing function in Java ME/J2ME)
    问题 我已经在诺基亚开发者论坛上发布了这个问题,请耐心等待。 我正在编写一个应用程序,该应用程序需要查找使用唯一值键入的URL的SHA-256哈希-即hmac('sha256', '27/3', '9EWVFmHpHN6n2YKW9QtvUqX3xbsFQUBovlrFddqnF7fpcSDA2q') 。 用Java ME / J2ME做到这一点的最佳方法是什么? 我已经找到了使用Mac类的许多示例,但是Java ME / J2ME不支持此示例。 提前致谢。 回答1 我设法使一切正常,解决方案如下: Digest digest = new SHA256Digest(); HMac hmac = new HMac(digest); hmac.init(new KeyParameter(appKeyHere)); hmac.update(requestURI, 0, lenOfReqURI); byte[] resBuf = new byte[digest.getDigestSize()]; hmac.doFinal(resBuf, 0); String resStr = new String(Hex.encode(resBuf)); // Contains final usable value 回答2 BouncyCastle的最新J2ME兼容发行版(轻量级API)除其他外
  • 单元测试视图 - 最佳实践(Unit test views - best practice)
    问题 任何人都可以分享单元测试视图的经验吗? 我阅读了很多关于如何使用视图进行单元测试的教程,但一切都有一些缺点。 我采用了以下方法。 它有效,但我想知道是否有更好的方法来做到这一点。 还有一些缺点,我稍后会解释。 我也在用量角器进行 E2E 测试,但它们总是很慢,因此我将它们限制在最低限度。 这是我的控制器。 它有两个变量绑定到它的$scope ,它们在视图中使用: // test_ctrl.js angular.module('app', []) .controller('TestCtrl', ["$rootScope", "$scope", function ($rootScope, $scope) { $scope.bar = "TEST"; $scope.jobs = [ {name: "cook"} ]; }]); 该视图将$scope.bar放入一个<span>并将$scope.jobs数组放入一个ng-repeat指令中: <!-- test.html the view for this controller --> <span> Bar is {{bar || "NOT SET"}} </span> <ul> <li ng-repeat="job in jobs">{{job.name}}</li> </ul> 这是测试: describe('Controller
  • SSM天猫整站项目实战---巩固基础知识最好的方法就是写项目
    前言成熟的项目规划与设计 本教程作者,有8年企业开发管理经验,7年教学经验,曾参与管理开发几十个商业项目。将展示如何合理设计与规划这样一个规模的电商项目,既做到功能丰富,又让开发节奏有条不紊。基于SSM框架技术 本项目使用SSM框架进行系统设计与开发,同学们可以观察并模仿到SSM是如何成熟,并高效率地实现各种业务场景的。由浅入深 以动手为主,代码驱动,从简单功能开始,逐一展开,配合图文视频讲解,由浅入深,迭代开发,享受一个项目的从无到有的构建过程编程思想 不仅用到了经典的SSM解决方案,还在此基础之上进行了多次重构,弥补SSM框架本身的不足之处,观察,模仿与学习这个重构的过程,将非常有助于在编程思想方面的提升。典型场景 一个完整的JAVA WEB应用包含的各种典型商务应用场景的需求,展示相应的解决思路与办法简历中的亮点 一份能获得面试机会的简历,必须要有项目经验的。 踏踏实实地把这个项目跟完,让简历多一个亮点,多一项谈资,多一层砝码,多一些薪水技术准备为了完成这个J2ee项目,需要掌握如下技术,当然也可以以本项目为驱动,哪里不懂,学哪里,其实这也是最好的学习方式(带着目标去学习) JavaJava基础 和 Java中级 的大部分内容 前端:HTML, CSS, JAVASCRIPT, JQUERY,AJAX, Bootstrap J2EE:TOMCAT, SERVLET, JSP
  • 绑定类切换到窗口滚动事件(Bind class toggle to window scroll event)
    问题 当用户将浏览器窗口滚动到某个点以下时,我正在切换#page div的类。 到目前为止,我所做的工作正常: http://jsfiddle.net/eTTZj/29/ <div ng-app="myApp" scroll id="page"> <header></header> <section></section> </div> app = angular.module('myApp', []); app.directive("scroll", function ($window) { return function(scope, element, attrs) { angular.element($window).bind("scroll", function() { if (this.pageYOffset >= 100) { element.addClass('min'); console.log('Scrolled below header.'); } else { element.removeClass('min'); console.log('Header is in view.'); } }); }; }); (当他们将窗口滚动到标头下方100px时,将切换该类) 虽然,如果我错了,请纠正我,但我认为这不是使用Angular进行此操作的正确方法。 相反
  • HTTP 摘要身份验证(HTTP Digest Authentication)
    问题 我想将 HTTP 摘要身份验证与存储用户名和加密密码的中央数据库一起使用。 这些数据应该由不同的服务器使用,例如 Apache httpd 或 Tomcat。 客户端将是使用浏览器和其他应用程序以 RESTful 方式进行通信的人。 据我所知,我不能使用带有散列密码的表。 只可能在需要明文密码的地方存储 HA1 = MD5(username:realm:password) - 正确吗? 另一方面,似乎可以在 Apache httpd 中使用散列密码: Apache httpd 文档说: 查询语句返回的第一行的第一列值应该是包含加密密码的字符串。 它是否适用于摘要式身份验证? 没有参数来指定哈希算法。 Apache httpd 如何决定使用哪种算法? RFC 2617 说: 4.13 存储密码摘要式身份验证要求身份验证代理(通常是服务器)将一些从用户名和密码派生的数据存储在与给定领域关联的“密码文件”中。 通常这可能包含由用户名和 H(A1) 组成的对,其中 H(A1) 是如上所述的用户名、领域和密码的摘要值。 听起来密码必须是明文。 Servlet 3.0 规范说: 虽然密码不会通过网络发送,但 HTTP 摘要身份验证要求身份验证容器可以使用明文密码等效项,以便它可以通过计算预期摘要来验证接收到的身份验证器。 这里的“明文密码等效”是什么? 密码哈希? Tomcat 文档说:
  • 使用加密模块的流功能获取文件的哈希(即:不使用hash.update和hash.digest)(Obtaining the hash of a file using the stream capabilities of crypto module (ie: without hash.update and hash.digest))
    问题 node.js的加密模块(至少在撰写本文时)仍未被认为是稳定的,因此API可能会发生变化。 实际上,互联网上每个人用来获取文件的哈希值(md5,sha1,...)的方法都被认为是旧方法(来自Hash类的文档)(注:强调我的方法): 类:哈希用于创建数据的哈希摘要的类。 它是可读写的流。 写入的数据用于计算哈希。 流的可写端结束后,使用read()方法获取计算得出的哈希摘要。 还支持旧式更新和摘要方法。 由crypto.createHash返回。 尽管hash.update和hash.digest被认为是旧版,但在引述片段上方显示的示例hash.update使用它们。 在不使用这些旧方法的情况下获取哈希的正确方法是什么? 回答1 从问题中引述的摘录中: [Hash类]它是可读可写的流。 写入的数据用于计算哈希。 流的可写端结束后,使用read()方法获取计算得出的哈希摘要。 因此,您需要对一些文本进行哈希处理是: var crypto = require('crypto'); // change to 'md5' if you want an MD5 hash var hash = crypto.createHash('sha1'); // change to 'binary' if you want a binary hash. hash.setEncoding('hex')
  • What's the best way to calculate a numerical derivative in MATLAB?
    (Note: This is intended to be a community Wiki.) Suppose I have a set of points xi = {x0,x1,x2,...xn} and corresponding function values fi = f(xi) = {f0,f1,f2,...,fn}, where f(x) is, in general, an unknown function. (In some situations, we might know f(x) ahead of time, but we want to do this generally, since we often don't know f(x) in advance.) What's a good way to approximate the derivative of f(x) at each point xi? That is, how can I estimate values of dfi == d/dx fi == df(xi)/dx at each of the points xi? Unfortunately, MATLAB doesn't have a very good general-purpose, numerical
  • 验证流星中的用户密码(Verify user password in Meteor)
    问题 用户可以在我的应用中执行一些不可逆的操作。 为了提高安全性,我想验证执行此操作的人实际上是登录用户。 我该如何实现? 对于具有密码的用户,我想要一个提示,要求您再次输入用户密码。 以后如何验证该密码,而无需通过电线发送呢? 通过外部服务登录的用户是否可以执行类似的操作? 如果是,该如何实现? 回答1 我可以为第一个问题提供帮助。 在撰写本文时,流星还没有checkPassword方法,但是您可以按照checkPassword方法进行操作: 在客户端上,我将假设您有一个表单,其中包含一个名为password的输入和一个名为check-password的按钮。 事件代码如下所示: Template.userAccount.events({ 'click #check-password': function() { var digest = Package.sha.SHA256($('#password').val()); Meteor.call('checkPassword', digest, function(err, result) { if (result) { console.log('the passwords match!'); } }); } }); 然后在服务器上,我们可以像这样实现checkPassword方法: Meteor.methods({
  • 打字稿异步/等待不会更新AngularJS视图(Typescript async/await doesnt update AngularJS view)
    问题 我正在使用Typescript 2.1(开发人员版本)将异步/等待转换为ES5。 我注意到,在更改了必须在异步函数中查看的任何属性后,该视图不会使用当前值进行更新,因此每次我必须在函数末尾调用$ scope。$ apply()时。 异步代码示例: async testAsync() { await this.$timeout(2000); this.text = "Changed"; //$scope.$apply(); <-- would like to omit this } 此后,新的text值不会显示在视图中。 有没有解决方法,所以我不必每次都手动调用$ scope。$ apply()? 回答1 这里的答案是正确的,因为AngularJS不知道该方法,因此您需要“告诉” Angular有关已更新的任何值。 我个人将$q用于异步行为,而不是将await用作其“ Angular方式”。 您可以很容易地用$ q包装非Angular方法,即[注意,这是我包装所有Google Maps函数的方式,因为它们都遵循这种传递回调的模式,以通知完成情况] function doAThing() { var defer = $q.defer(); // Note that this method takes a `parameter` and a callback function
  • AngularJS: Best way to watch dimensions?
    So, I've come up with a few solutions to this and I'm still not quite sure what is best. First for reference there is one similar question I could find, though it's a bit old. Here it is for anyone reading this later: Watching dimension changes in Angular The Goal I have portions of my app in which responsive height elements are needed. I want the fastest, most visually appealing way to do this at the UI/directive layer without the need of explicitly broadcasted change events. Option One: Directive A simple directive can record the dimensions on every digest loop (and resize event) return {
  • 如何对URL进行JSON调用?(How to make a JSON call to a url?)
    问题 我正在查看以下API: http://wiki.github.com/soundcloud/api/oembed-api 他们举的例子是 称呼: http://soundcloud.com/oembed?url=http%3A//soundcloud.com/forss/flickermood&format=json 回复: { "html":"<object height=\"81\" ... ", "user":"Forss", "permalink":"http:\/\/soundcloud.com\/forss\/flickermood", "title":"Flickermood", "type":"rich", "provider_url":"http:\/\/soundcloud.com", "description":"From the Soulhack album...", "version":1.0, "user_permalink_url":"http:\/\/soundcloud.com\/forss", "height":81, "provider_name":"Soundcloud", "width":0 } 我该怎么做才能仅通过URL获取此JSON对象? 回答1 看来他们为format参数提供了一个js选项,它将返回JSONP。
  • 替换Firebase密钥中无效字符的好方法?(Good way to replace invalid characters in firebase keys?)
    问题 我的用例是保存用户的信息。 当我尝试使用用户的电子邮件地址作为密钥将数据保存到Firebase时,Firebase会引发以下错误: 错误:密钥e@e.ee无效(不能包含.$[]# ) 因此,显然,我无法通过用户的电子邮件为用户信息编制索引。 什么是取代的最佳做法. ? 我已成功更改了. 到-但不会削减它,因为一些电子邮件的有-在地址秒。 目前,我正在使用 var cleanEmail = email.replace('.','`'); 但是与此相关的地方很可能会发生冲突。 回答1 在电子邮件地址中,替换点. 用逗号, 。 此模式是最佳做法。 逗号,是不是在电子邮件地址中允许的字符,但它是在一个火力地堡键允许的。 对称地,点. 在电子邮件地址允许的字符,但它不是在火力地堡键允许的。 因此,直接替换将解决您的问题。 您可以索引电子邮件地址而无需循环。 您还有另一个问题。 const cleanEmail = email.replace('.',','); // only replaces first dot 只会替换第一个点. 但是电子邮件地址可以有多个点。 要替换所有点,请使用正则表达式。 const cleanEmail = email.replace(/\./g, ','); // replaces all dots 或者,您也可以使用split() - join(
  • Unit test views - best practice
    Can anyone share experience with unit testing views? I read a lot of tutorials about how to do unit testing with views, but everything has some drawbacks. I came along with the following approach. It works, but I'm wondering if there is a better way to do this. There are also some drawbacks, which I'll explain later on. I'm also doing E2E tests with protractor, but they are always slow, and therefore I limit them to a minimum. This is my controller. It has two variables bound to its $scope which are used in the view: // test_ctrl.js angular.module('app', []) .controller('TestCtrl', ["