默认实现如何GetHashCode()工作?它是否有效且足够好地处理结构,类,数组等?
我试图决定在什么情况下我应该自己打包,在什么情况下我可以安全地依赖默认实现来做好.如果可能的话,我不想重新发明轮子.
我有一个计数器哈希,我试图按计数排序.我遇到的问题是默认的Hash.sort函数将数字排序为字符串而不是数字大小.
即鉴于哈希:
metrics = {"sitea.com" => 745, "siteb.com" => 9, "sitec.com" => 10 }
Run Code Online (Sandbox Code Playgroud)
运行此代码:
metrics.sort {|a1,a2| a2[1]<=>a1[1]}
Run Code Online (Sandbox Code Playgroud)
将返回一个已排序的数组:
[ 'siteb.com', 9, 'sitea.com', 745, 'sitec.com', 10]
Run Code Online (Sandbox Code Playgroud)
尽管745的数字大于9,但9会出现在列表的第一位.当试图表明谁拥有最高统计数时,这让我的生活变得困难.:)
关于如何按数值大小排序哈希(或数组偶数)的任何想法?
我感谢任何帮助.
Git的内部数据结构是一个数据对象树,其中每个对象只指向其前身.每个数据块都经过哈希处理.当保存的哈希与实际哈希偏离时,将注意到修改(位错误或攻击)中间块.
这个概念与区块链有何不同?
Git未列为块链的示例,但至少在摘要中,两种数据结构描述看起来都相似:数据块,单向反向链接,哈希,......).
那么差异在哪里,Git不被称为区块链?
我正在尝试为字符串设想一个好的哈希函数.而且我认为总结字符串中前五个字符的unicode值可能是一个好主意(假设它有五个,否则在它结束时停止).这是一个好主意,还是一个坏主意?
我在Java中这样做,但我不认为这会产生很大的不同.
结论: SHA-1和preimage攻击一样安全,但它很容易计算,这意味着更容易安装暴力攻击或字典攻击.(对于像SHA-256这样的后继者也是如此.)根据具体情况,设计成计算成本高的哈希函数(例如bcrypt)可能是更好的选择.
有些人会像"SHA-1被打破"那样发表评论,所以我试图理解究竟是什么意思.假设我有一个SHA-1密码哈希的数据库,一个攻击者使用最先进的SHA-1破解算法和一个拥有100,000台机器的僵尸网络可以访问它.(控制超过10万台家用计算机意味着他们每秒可以完成大约10 ^ 15次操作.)他们需要多长时间
如果密码被腌制,它会如何改变?腌制的方法(前缀,后缀,两者,还是像xor-ing这样复杂的东西)是否重要?
这是我目前的理解,经过一些谷歌搜索.如果我误解了某些内容,请在答案中更正.
简而言之,使用SHA-1存储密码似乎非常安全.我错过了什么?
更新:马塞洛指出了一篇文章,其中提到了2 106次操作中的第二次原像攻击.(编辑:正如托马斯解释的那样,这种攻击是一种假设的结构,不适用于现实场景.)但我仍然没有看到这对于使用SHA-1作为关键的派生函数是多么危险.通常有充分的理由认为碰撞攻击或第二次原始图像攻击最终会变成第一次原始图像攻击吗?
像许多人一样,我使用ReSharper来加速开发过程.当您使用它来覆盖类的相等成员时,它为GetHashCode()生成的代码生成如下所示:
public override int GetHashCode()
{
unchecked
{
int result = (Key != null ? Key.GetHashCode() : 0);
result = (result * 397) ^ (EditableProperty != null ? EditableProperty.GetHashCode() : 0);
result = (result * 397) ^ ObjectId;
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
当然我有一些自己的成员,但我想知道的是为什么397?
我遇到了一个讨论,其中我了解到我一直在做的事情实际上并没有腌制密码而是给它们加油,而且我已经开始使用以下功能:
hash_function($salt.hash_function($pepper.$password)) [multiple iterations]
Run Code Online (Sandbox Code Playgroud)
忽略所选的哈希算法(我希望这是对盐和辣椒的讨论,而不是特定的算法,但我使用的是安全算法),这是一个安全的选择还是我应该做一些不同的事情?对于那些不熟悉这些条款的人:
甲盐是通常存储与设计,使其不可能使用哈希表来破解密码的数据库中的字符串中的随机生成值.由于每个密码都有自己的盐,因此必须对它们进行单独的强制攻击才能破解它们; 但是,由于salt使用密码哈希存储在数据库中,因此数据库泄露意味着丢失两者.
甲胡椒是从中旨在是秘密的数据库(在应用程序的源代码通常硬编码)分开存储站点范围静态值.它的使用是为了破坏数据库不会导致整个应用程序的密码表变得暴力破解.
有什么我缺少的,并且正在腌制和密封我的密码是保护用户安全的最佳选择吗?这样做有没有潜在的安全漏洞?
注意:为了讨论的目的,假设应用程序和数据库存储在不同的机器上,不共享密码等,因此违反数据库服务器并不会自动意味着破坏应用程序服务器.
基本上,我正在尝试创建一个独特对象的对象,一组.我有一个很好的想法,就是只使用带有对象的JavaScript对象作为属性名称.如,
set[obj] = true;
Run Code Online (Sandbox Code Playgroud)
这很有效.它适用于字符串和数字,但对于其他对象,它们似乎都"散列"到相同的值并访问相同的属性.是否有某种方法可以为对象生成唯一的哈希值?字符串和数字如何做,我可以覆盖相同的行为吗?
WordPress使用什么类型的哈希?
以下是WordPress哈希的示例:
$ P $ Bp.ZDNMM98mGNxCtHSkc1DqdRPXeoR.
我尝试使用SHA256散列字符串,我使用以下代码:
using System;
using System.Security.Cryptography;
using System.Text;
public class Hash
{
public static string getHashSha256(string text)
{
byte[] bytes = Encoding.Unicode.GetBytes(text);
SHA256Managed hashstring = new SHA256Managed();
byte[] hash = hashstring.ComputeHash(bytes);
string hashString = string.Empty;
foreach (byte x in hash)
{
hashString += String.Format("{0:x2}", x);
}
return hashString;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,与我的朋友php以及在线生成器(例如This generator)相比,此代码提供了显着不同的结果.
有谁知道错误是什么?不同的基地?