用于密码散列的非随机盐

更新:我最近从这个问题中得知,在下面的整个讨论中,我(我确信其他人也是)也有点混乱:我一直称之为彩虹表,实际上称为哈希表。 彩虹表是更复杂的生物,实际上是Hellman哈希链的变种。 虽然我相信答案仍然是一样的(因为它不能归结为密码分析),但是有些讨论可能有些偏差。 这个问题:“ 什么是彩虹桌,他们是如何使用的? ” 通常情况下,我总是build议使用密码强的随机值作为盐,与散列函数(例如密码)一起使用,以防止彩虹表攻击。 但是,盐是随机的,它实际上是密码学上必要的吗? 任何独特的价值(唯一的每个用户,例如userId)在这方面就足够了? 它实际上会阻止使用单个彩虹表来破解系统中的所有(或大部分)密码。 但熵的缺乏是否真的削弱了哈希函数的密码强度呢? 请注意,我不是问为什么要使用盐,如何保护它(不需要),使用单个常量散列(不),或使用什么样的散列函数。 盐是否需要熵。 感谢所有答案到目前为止,但我想专注于我(一点)不太熟悉的领域。 密码分析的主要影响 – 我会很感激,如果有人有一些来自encryptionmathPoV的input。 另外,如果还有额外的vector没有被考虑,那也是很好的input(参见@Dave Sherohman指向多个系统)。 除此之外,如果您有任何理论,想法或最佳实践 – 请以证据,攻击情景或经validation据作为背景。 或者甚至是可以接受的权衡的有效考虑…我对这个问题上的最佳实践(资本B资本P)很熟悉,我想certificate这实际上提供了什么价值。 编辑:这里有一些非常好的答案,但我认为@Dave说,它归结为彩虹表的常见用户名称…也可能不太常用的名称。 但是,如果我的用户名是全球唯一的呢? 不一定是我的系统唯一的,但每个用户 – 例如电子邮件地址。 对于单个用户来说,build立RT是没有任何意义的(正如@Dave强调的那样,盐不是保密的),这仍然会阻止集群。 唯一的问题是,我可能会在不同的网站上有相同的电子邮件和密码 – 但盐无论如何不会阻止。 所以,它回到了密码分析 – 熵是必要的,还是不是? (我目前的想法是从密码分析的angular度来看没有必要,但是这是出于其他实际的原因)。

为什么Ruby 1.9.2从LOAD_PATH中删除“。”,还有什么办法呢?

Ruby 1.9.2的最新变更不再生成当前目录. 你的LOAD_PATH一部分。 我有一个不重要的Rakefiles数量假设. 是LOAD_PATH一部分,所以这打破了他们(他们报告“没有这样的文件加载”的基于项目path的所有需求语句)。 有没有特别的理由呢? 至于解决方法,添加$: << "." 无处不在,但似乎令人难以置信的,我不想这样做。 什么是使我的Rakefiles 1.9.2 +兼容的首选方式?

Android 5.1.1及以上 – getRunningAppProcesses()只返回我的应用程序包

Google似乎最终closures了获取当前前台应用程序包的所有大门。 在Lollipop更新之后,杀死了getRunningTasks(int maxNum)并感谢这个答案 ,我使用这个代码来获取自Lollipop以来的前台应用程序包: final int PROCESS_STATE_TOP = 2; RunningAppProcessInfo currentInfo = null; Field field = null; try { field = RunningAppProcessInfo.class.getDeclaredField("processState"); } catch (Exception ignored) { } ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE); List<RunningAppProcessInfo> appList = am.getRunningAppProcesses(); for (RunningAppProcessInfo app : appList) { if (app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND && app.importanceReasonCode == 0 ) { Integer state […]

Android基础知识:在UI线程中运行代码

在UI线程中运行代码的观点,有没有区别: MainActivity.this.runOnUiThread(new Runnable() { public void run() { Log.d("UI thread", "I am the UI thread"); } }); 要么 MainActivity.this.myView.post(new Runnable() { public void run() { Log.d("UI thread", "I am the UI thread"); } }); 和 private class BackgroundTask extends AsyncTask<String, Void, Bitmap> { protected void onPostExecute(Bitmap result) { Log.d("UI thread", "I am the UI thread"); […]

什么是分配Java应用程序的最佳方式?

Java是我select的编程语言之一。 尽pipe将应用程序分发给最终用户,但我总是遇到这个问题。 给用户一个JAR并不总是如我所愿,并且使用Java WebStart要求我维护一个Web服务器。 什么是分发Java应用程序的最佳方式? 如果Java应用程序需要将伪像安装到用户的计算机上怎么办? 那里有没有好的Java安装/包装系统?

使用额外列映射多对多关联表

我的数据库包含3个表:用户和服务实体具有多对多的关系,并与SERVICE_USER表连接如下: 用户 – SERVICE_USER – 服务 SERVICE_USER表包含额外的BLOCKED列。 执行这种映射的最佳方法是什么? 这些是我的实体类 @Entity @Table(name = "USERS") public class User implements java.io.Serializable { private String userid; private String email; @Id @Column(name = "USERID", unique = true, nullable = false,) public String getUserid() { return this.userid; } …. some get/set methods } @Entity @Table(name = "SERVICES") public class CmsService implements […]

在SQL中,你如何在范围内“分组”?

假设我有一个数字列表(让我们称之为“分数”)。 我想生成一个计数表,显示每个范围内出现了多less次分数。 例如: 得分范围| 发生次数 ————————————- 0-9 | 11 10-19 | 14 20-29 | 3 … | … 在这个例子中,有11行,分数在0到9之间,14行在10到19之间,而3行在20到29之间。 有没有简单的方法来设置? 你有什么build议?

在Twitter Bootstrap中使用col-lg-push和col-lg-pull的列顺序操作3

我现在正在阅读Twitter Bootstrap 3上的文档,并试图按照本页所示的列顺序排列,但却撞到了墙上。 我不明白为什么这样的代码工作,也不知道如何正确指定设置。 我想要展示的是一个网格,它由长度5和另一个长度5组成,最后是一个长度为2的网格。 所以我的是这样的: [5] [5] [2] 而我想要达到的是,当在桌面上查看上面的布局显示,但是当在移动设备上查看时,我想先显示第二个长度为5的对象,然后是第一个长度为5的对象,最后是长度为2的对象, 垂直。 喜欢这个: [5] (second) [5] (first) [2] 虽然我试图按照上述文档中解释的步骤操作,但我仍然在移动平台上获得了第一个长度为5的对象,正如我所说的,应该在顶部显示第二个长度为5的对象。 换句话说,我得到了这个: [5] (first) [5] (second) [2] 那么我怎么才能把第二个正确的放在第一个呢? 或者,因为我使用相同的长度的对象,列sorting不能工作? 这是我的代码为您的信息: <div class='row'> <div class='col-lg-5 col-lg-push-5'></div> <div class='col-lg-5 col-lg-pull-5'></div> <div class='col-lg-2'></div> </div> 另外,文档没有阐明pull或push意思。 所以我错过了什么? 谢谢。

在Mac OS X上设置ANDROID_HOME环境variables

任何人都可以通过terminal发布工作解决scheme来设置ANDROID_HOME吗? 我的Android SDK的path是/Applications/ADT/sdk 。

Django将自定义窗体parameter passing给Formset

这是在Django 1.9与form_kwargs修复 。 我有一个Django窗体,如下所示: class ServiceForm(forms.Form): option = forms.ModelChoiceField(queryset=ServiceOption.objects.none()) rate = forms.DecimalField(widget=custom_widgets.SmallField()) units = forms.IntegerField(min_value=1, widget=custom_widgets.SmallField()) def __init__(self, *args, **kwargs): affiliate = kwargs.pop('affiliate') super(ServiceForm, self).__init__(*args, **kwargs) self.fields["option"].queryset = ServiceOption.objects.filter(affiliate=affiliate) 我用这样的东西来称呼这个表单: form = ServiceForm(affiliate=request.affiliate) 其中request.affiliate是login的用户。 这按预期工作。 我的问题是,我现在想把这个单一的forms变成一个formset。 我无法弄清楚的是如何在创buildformset时将联盟信息传递给各个表单。 根据这个文档,我需要做这样的事情: ServiceFormSet = forms.formsets.formset_factory(ServiceForm, extra=3) 然后我需要像这样创build它: formset = ServiceFormSet() 现在我怎么可以通过这种方式将affiliate = request.affiliate传递给个人表单?