javascript

java

python

c#

node.js

reactjs

android

php

c++

html

jquery

ruby-on-rails

css

git

ios

.net

sql

c

string

<img src="//i.stack.imgur.com/bk9VA.png" alt="" class="sponsor-tag-img" width="18" height="16"/>android

Ruby - 访问多维哈希并避免访问nil obj

可能重复:
Ruby:Nils在IF语句中
是否有一种干净的方法可以避免在嵌套的params哈希中调用nil上的方法?

假设我尝试访问这样的哈希:

my_hash['key1']['key2']['key3']

如果key1中存在key1,key2和key3,这很好,但是如果,例如key1不存在呢?

然后我会得到if my_hash['key1'] && my_hash['key1']['key2'].没人会喜欢。

到目前为止,我处理这个有条件的事情:

if my_hash['key1'] && my_hash['key1']['key2'] ...

这是否合适,还有其他Rubiest方式吗?

trans by 2019-09-18T00:43:23Z

ruby - 如何从哈希中提取子哈希?

我有一个哈希:

h1 = {:a => :A, :b => :B, :c => :C, :d => :D}

提取像这样的子哈希的最佳方法是什么?

h1.extract_subhash(:b, :d, :e, :f) # => {:b => :B, :d => :D}
h1 #=> {:a => :A, :c => :C}
trans by 2019-09-17T00:12:20Z

如何从两个大小相同的数组中构建Ruby哈希?

我有两个数组

a = [:foo, :bar, :baz, :bof]

b = ["hello", "world", 1, 2]

我想要

{:foo => "hello", :bar => "world", :baz => 1, :bof => 2}

有什么办法吗?

trans by 2019-09-16T04:00:00Z

c# - 在.NET中,如果null的哈希码始终为零

鉴于像HashSet<>这样的集合接受null作为集合成员,可以问HashSet<>的哈希码应该是什么。 看起来框架使用m_buckets

// nullable struct type
int? i = null;
i.GetHashCode();  // gives 0
EqualityComparer<int?>.Default.GetHashCode(i);  // gives 0

// class type
CultureInfo c = null;
EqualityComparer<CultureInfo>.Default.GetHashCode(c);  // gives 0

对于可以为空的枚举,这可能会(有点)出现问题。 如果我们定义

enum Season
{
  Spring,
  Summer,
  Autumn,
  Winter,
}

那么HashSet<>(也称为null)可以只取五个值,但其中两个,即HashSet<>m_buckets,具有相同的哈希码。

写这样一个“更好”的平等比较器是很诱人的:

class NewNullEnumEqComp<T> : EqualityComparer<T?> where T : struct
{
  public override bool Equals(T? x, T? y)
  {
    return Default.Equals(x, y);
  }
  public override int GetHashCode(T? x)
  {
    return x.HasValue ? Default.GetHashCode(x) : -1;
  }
}

但是有什么理由为什么HashSet<>的哈希码应该是null

编辑/添加:

有些人似乎认为这是至关重要的HashSet<>.事实上,实际上并非如此。 (.NET的作者确实在HashSet<>结构中覆盖了null,这是相关的。)无参数m_buckets的用户编写实现永远不能处理我们寻找其哈希码的对象是m_slots的情况。

这是关于实现抽象方法HashSet<>或以其他方式实现接口方法HashSet<>.现在,在创建这些到MSDN的链接时,我看到它说那些方法抛出HashSet<>,如果它们的唯一参数是null.这肯定是一个错误 在MSDN上? .NET自己的实现都没有抛出异常。 在这种情况下投掷将有效地打破任何将HashSet<>添加到m_buckets的尝试。除非m_slots在处理null项目时做了一些特别的事情(我将不得不测试)。

新编辑/附加:

现在我尝试了调试。 使用HashSet<>,我可以确认使用默认的相等比较器,值nullHashSet<>将在同一个存储桶中结束。 这可以通过非常仔细地检查专用阵列成员m_bucketsm_slots来确定。注意,索引总是按设计偏移一。

但是,我上面给出的代码并没有解决这个问题。 事实证明,当值为null时,HashSet<>将永远不会询问相等比较器。这是源代码HashSet<>

    // Workaround Comparers that throw ArgumentNullException for GetHashCode(null).
    private int InternalGetHashCode(T item) {
        if (item == null) { 
            return 0;
        } 
        return m_comparer.GetHashCode(item) & Lower31BitMask; 
    }

这意味着,至少对于HashSet<>,甚至不可能更改null的散列。相反,解决方案是更改所有其他值的散列,如下所示:

class NewerNullEnumEqComp<T> : EqualityComparer<T?> where T : struct
{
  public override bool Equals(T? x, T? y)
  {
    return Default.Equals(x, y);
  }
  public override int GetHashCode(T? x)
  {
    return x.HasValue ? 1 + Default.GetHashCode(x) : /* not seen by HashSet: */ 0;
  }
}
trans by 2019-09-12T06:01:58Z

c - 什么整数散列函数适合接受整数散列键?

什么整数散列函数是好的,接受整数散列键?

trans by 2019-09-11T11:47:55Z

加密 - 为什么MD5哈希值不可逆?

我一直想知道的一个概念是使用加密哈希函数和值。 我知道这些函数可以生成一个唯一且几乎不可能反转的哈希值,但这是我一直想知道的:

如果在我的服务器上,在PHP中我生成:

md5("stackoverflow.com") = "d0cc85b26f2ceb8714b978e07def4f6e"

通过MD5函数运行相同的字符串时,您在PHP安装上获得相同的结果。 正在使用一个过程从一些起始值产生一些值。

这是不是意味着有一些方法来解构正在发生的事情并扭转哈希值?

这些函数是什么使得结果字符串无法回溯?

trans by 2019-09-11T06:24:25Z

加密 - 两个不同的字符串可以生成相同的MD5哈希码吗?

对于我们的每个二进制资产,我们生成MD5哈希。 这用于检查某个二进制资产是否已存在于我们的应用程序中。 但两个不同的二进制资产是否可能生成相同的MD5哈希值。 那么两个不同的字符串是否可能生成相同的MD5哈希?

trans by 2019-09-10T09:37:44Z

php - 如何使用河豚散列长密码(> 72个字符)

上周我读了很多关于密码哈希和Blowfish的文章,似乎是(现在)最好的哈希算法之一 - 但这不是这个问题的主题!

72个字符的限制

Blowfish只考虑输入密码中的前72个字符:

<?php
$password = "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)";
$hash = password_hash($password, PASSWORD_BCRYPT);
var_dump($password);

$input = substr($password, 0, 72);
var_dump($input);

var_dump(password_verify($input, $hash));
?>

输出是:

string(119) "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)"
string(72) "Wow. This is a super secret and super, super long password. Let's add so"
bool(true)

正如您所看到的,只有前72个字符很重要。 Twitter正在使用blowfish aka bcrypt来存储他们的密码([https://shouldichangemypassword.com/twitter-hacked.php]]并猜测:将你的Twitter密码更改为超过72个字符的长密码,你可以登录到你的 帐户只输入前72个字符。

河豚和胡椒

关于“胡椒”密码有很多不同的意见。 有些人说这是不必要的,因为你必须假设秘密胡椒串也是已知/已发布的,因此它不会增强散列。 我有一个单独的数据库服务器,所以很可能只有数据库被泄露而不是常数胡椒。

在这种情况下(辣椒没有泄漏)你根据字典进行攻击更加困难(如果这不对,请纠正我)。 如果你的辣椒串也泄漏了:没那么糟糕 - 你仍然有盐,它就像没有辣椒的哈希一样受到保护。

因此,我认为密码密码至少是不错的选择。

建议

我建议为超过72个字符(和胡椒)的密码获取Blowfish哈希是:

<?php
$pepper = "foIwUVmkKGrGucNJMOkxkvcQ79iPNzP5OKlbIdGPCMTjJcDYnR";

// Generate Hash
$password = "Wow. This is a super secret and super, super long password. Let's add some special ch4r4ct3rs a#d everything is fine :)";
$password_peppered = hash_hmac('sha256', $password, $pepper);
$hash = password_hash($password_peppered, PASSWORD_BCRYPT);

// Check
$input = substr($password, 0, 72);
$input_peppered = hash_hmac('sha256', $input, $pepper);

var_dump(password_verify($input_peppered, $hash));
?>

这是基于这个问题:password_verify返回false

问题

什么是更安全的方式? 首先获取SHA-256哈希(返回64个字符)或仅考虑密码的前72个字符?

优点

  • 用户只能输入前72个字符才能登录
  • 您可以添加胡椒而不超过字符限制
  • hash_hmac的输出可能比密码本身具有更多的熵
  • 密码由两个不同的函数进行散列

缺点

  • 只有64个字符用于构建blowfish哈希


编辑1:这个问题只针对blowfish / bcrypt的PHP集成。 感谢您的评论!

trans by 2019-09-10T06:56:00Z

安全性 - 用于密码哈希的非随机盐

更新:我最近从这个问题中了解到,在下面的整个讨论中,我(我确信其他人也这样做)有点令人困惑:我一直称之为彩虹表,实际上称为哈希表。 彩虹桌是更复杂的生物,实际上是Hellman Hash Chains的变种。 虽然我认为答案仍然是相同的(因为它不归结为密码分析),但有些讨论可能有点偏差。
问题是:“什么是彩虹表,它们是如何使用的?”


通常,我总是建议使用加密强随机值作为salt,与哈希函数(例如密码)一起使用,例如防止彩虹表攻击。

但实际上盐是随机的加密必要吗? 在这方面,任何唯一值(每个用户唯一,例如userId)是否足够? 事实上,它会阻止使用单个Rainbow Table来破解系统中的所有(或大多数)密码......
但缺乏熵真的会削弱哈希函数的加密强度吗?


注意,我不是在问为什么要使用salt,如何保护它(它不需要),使用单个常量哈希(不要),或者使用什么样的哈希函数。
无论盐是否需要熵。


感谢所有答案到目前为止,但我想集中讨论我(有点)不太熟悉的领域。 主要是对密码分析的影响 - 如果有人从密码数学PoV获得一些输入,我会非常感激。
此外,如果还有其他未被考虑的向量,那也是很好的输入(参见@Dave Sherohman指向多个系统)。
除此之外,如果您有任何理论,想法或最佳实践 - 请使用证据,攻击情景或经验证据来支持这一点。 或者甚至是可接受的权衡的有效考虑因素......我对该主题的最佳实践(资本B资本P)很熟悉,我想证明这实际上提供了什么价值。


编辑:这里有一些非常好的答案,但我认为正如@Dave所说,它归结为Rainbow Tables的常见用户名......以及可能不太常见的名称。 但是,如果我的用户名是全局唯一的呢? 对我的系统来说不一定是唯一的,但对每个用户来说都是唯 电子邮件地址。
没有动力为单个用户构建RT(正如@Dave强调的那样,盐不会保密),这仍然会阻止群集。 唯一的问题是我可能在不同的网站上有相同的电子邮件和密码 - 但盐无论如何都不会阻止它。
因此,它回归到密码分析 - 是否需要熵? (我目前的想法是从密码分析的角度来看没有必要,但这是出于其他实际原因。)

trans by 2019-09-10T06:20:05Z

字典 - 如何在Perl中组合哈希?

将两个哈希值合并到%hash1的最佳方法是什么? 我总是知道%hash2和%hash1总是有唯一的密钥。 如果可能的话,我也更喜欢一行代码。

$hash1{'1'} = 'red';
$hash1{'2'} = 'blue';
$hash2{'3'} = 'green';
$hash2{'4'} = 'yellow';
trans by 2019-09-03T21:14:22Z

如何在Ruby中优雅地重命名哈希中的所有键?

这个问题在这里已有答案:

  • 如何通过一组新的给定键更改哈希的所有键                                     7个答案

我有一个Ruby哈希:

ages = { "Bruce" => 32,
         "Clark" => 28
       }

假设我有另一个替换名称的哈希,是否有一种优雅的方式来重命名所有键,以便我最终得到:

ages = { "Bruce Wayne" => 32,
         "Clark Kent" => 28
       }
trans by 2019-08-25T07:06:54Z

c ++ - 编译时间字符串散列

我在几个不同的地方读过,使用C ++ 11的新字符串文字,可以在编译时计算字符串的哈希值。 然而,似乎没有人准备出来说它将是可能的或如何完成。

  • 这可能吗?
  • 操作员会是什么样子?

我特别感兴趣的是这样的用例。

void foo( const std::string& value )
{
   switch( std::hash(value) )
   {
      case "one"_hash: one(); break;
      case "two"_hash: two(); break;
      /*many more cases*/
      default: other(); break;
   }
}

注意:编译时哈希函数不必像我写的那样完全一样。 我尽力猜测最终解决方案的样子,但meta_hash<"string"_meta>::value也可能是一个可行的解决方案。

trans by 2019-08-23T02:02:56Z

如何将ActiveRecord结果转换为哈希数组

我有一个查找操作的ActiveRecord结果:

tasks_records = TaskStoreStatus.find(
  :all,
  :select => "task_id, store_name, store_region",
  :conditions => ["task_status = ? and store_id = ?", "f", store_id]
)

现在我想将此结果转换为像这样的哈希数组:

[0] ->  { :task_d => 10, :store_name=> "Koramanagala", :store_region=> "India" }

[1] -> { :task_d => 10, :store_name=> "Koramanagala", :store_region=> "India" }

[2] ->  { :task_d => 10, :store_name=> "Koramanagala", :store_region=> "India" }

这样我就可以遍历数组并向哈希添加更多元素,然后将结果转换为JSON以获取我的API响应。 我怎样才能做到这一点?

trans by 2019-08-18T07:22:18Z

安全性 - 为哈希隐藏盐的必要性

在工作中,我们有两种相互竞争的盐理论。 我工作的产品使用类似用户名或电话号码来加密哈希值。 基本上每个用户都有不同的东西,但我们可以随时使用。 另一个产品为每个用户随机生成一个salt,并在每次用户更改密码时更改。 然后在数据库中加密盐。

我的问题是,第二种方法是否真的有必要? 从纯粹的理论角度来看,我可以理解它比第一种方法更安全,但从实用性的角度来看呢。 现在要对用户进行身份验证,必须将salt解密并应用于登录信息。

在考虑之后,我从这种方法中看不到真正的安全收益。 将盐从帐户更改为帐户,即使攻击者知道如何快速确定每个帐户的内容,仍然会使某人尝试强制执行散列算法变得非常困难。 这是基于密码足够强的假设。 (显然,找到一组密码的正确哈希值,它们都是两位数,比找到8位密码的正确哈希值要容易得多)。 我的逻辑是不正确的,还是我缺少的东西?

编辑:好的,这就是我认为加密盐真的没有用的原因。 (知道我是否在正确的轨道上)。

对于以下说明,我们假设密码总是8个字符,盐是5,所有密码都由小写字母组成(它只是使数学更容易)。

每个条目都有一个不同的盐意味着我不能使用相同的彩虹表(实际上,如果我有一个足够的大小,实际上我可以,但暂时忽略它)。 根据我的理解,这是盐的真正关键,因为要破解每个帐户,我必须重新发明轮子,以便为每个人说话。 现在,如果我知道如何将正确的盐应用于密码以生成哈希,我就这样做,因为盐实际上只是扩展了哈希短语的长度/复杂性。 因此,我将削减我需要生成的可能组合的数量,以及#34;知道&#34; 我有13 ^ 26到8 ^ 26的密码+盐,因为我知道盐是什么。 现在这使它变得更容易,但仍然非常困难。

所以加密盐。 如果我知道盐是加密的,我不会先尝试解密(假设我知道它有足够的加密级别)。 我会忽略它。 不要试图弄清楚如何解密它,回到前面的例子,我只会生成一个更大的彩虹表,其中包含13 ^ 26的所有键。 不知道盐肯定会减慢我的速度,但我不认为它会增加尝试首先破解盐加密的巨大任务。 这就是为什么我认为它不值得的原因。思考?

这是一个链接,描述了在强力攻击下密码的持续时间:[http://www.lockdown.co.uk/?pg=combi]

trans by 2019-08-10T21:30:03Z

ruby - Hash Rocket是否已被弃用?

引用良好的RIP Hash火箭帖似乎暗示Hash Rocket语法(:foo => "bar")不赞成使用新的Ruby JSON样式哈希(foo: "bar"),但我无法找到任何明确的参考说明 从Ruby 1.9开始,Hash Rocket表单实际上已被弃用/未经过修改。

trans by 2019-08-08T07:12:45Z

c ++ - 如何在无序容器中为用户定义的类型专门化std :: hash <Key> :: operator()?

std::unordered_set<Key>std::hash<X>::operator()中支持用户定义的密钥类型一个必须提供X和一个哈希函子:

struct X { int id; /* ... */ };
bool operator==(X a, X b) { return a.id == b.id; }

struct MyHash {
  size_t operator()(const X& x) const { return std::hash<int>()(x.id); }
};

std::unordered_set<X, MyHash> s;

只写std::hash<X>::operator()会更方便使用类型X的默认哈希,喜欢与编译器和库一起出现的类型。咨询后

  • C ++标准草案N3242§20.8.12[unord.hash]和§17.6.3.4[hash.requirements],
  • Boost.Unordered
  • g ++ std::hash<X>::operator()
  • VC10 std::hash<X>::operator()
  • Stack Overflow中的各种相关问题

似乎有可能专攻std::hash<X>::operator()

namespace std { // argh!
  template <>
  inline size_t 
  hash<X>::operator()(const X& x) const { return hash<int>()(x.id); } // works for MS VC10, but not for g++
  // or
  // hash<X>::operator()(X x) const { return hash<int>()(x.id); }     // works for g++ 4.7, but not for VC10 
}                                                                             

鉴于编译器对C ++ 11的支持尚未实验 - 我没有尝试过Clang ---,这些是我的问题:

  1. 将这样的专业化添加到命名空间std::hash<X>::operator()是否合法? 我对此感到复杂。

  2. std::hash<X>::operator()中的哪个版本(如果有)符合C ++ 11标准?

  3. 有可行的方法吗?

trans by 2019-08-07T23:54:44Z

安全性 - 生成OAuth令牌的最佳实践?

我意识到OAuth规范没有指定任何关于ConsumerKey,ConsumerSecret,AccessToken,RequestToken,TokenSecret或Verifier代码的来源,但我很好奇是否有任何创建显着安全令牌的最佳实践(特别是令牌/ 秘密组合)。

在我看来,创建令牌有几种方法:

  1. 只需使用随机字节,存储在与消费者/用户相关的数据库中
  2. 散列一些用户/消费者特定数据,存储在与消费者/用户相关联的数据库中
  3. 加密用户/特定于消费者的数据

(1)的优点是数据库是看起来最安全的信息的唯一来源。 对(2)或(3)进行攻击会更难。

散列实数据(2)将允许从可能已知的数据重新生成令牌。 可能没有真正为(1)提供任何优势,因为无论如何都需要存储/查找。 比(1)更多的CPU密集型。

加密真实数据(3)将允许解密以了解信息。 这将需要更少的存储空间。 查找次数可能少于(1)&amp; (2),但也可能不太安全。

是否还有其他方法/优点/缺点需要考虑?

编辑:另一个考虑因素是令牌中必须有某种随机值,因为必须存在过期和重新发行新令牌的能力,因此它不能只包含真实数据。

关注问题:

是否有最小的令牌长度,以显着加密安全? 据我了解,更长的令牌秘密会创建更安全的签名。 这种理解是否正确?

从散列角度来看,使用特定编码优于另一种编码是否有优势? 例如,我看到很多使用十六进制编码的API(例如GUID字符串)。 在OAuth签名算法中,令牌用作字符串。 使用十六进制字符串,可用字符集将比使用Base64编码的字符集小得多(更可预测)。 在我看来,对于两个长度相等的字符串,具有较大字符集的字符串将具有更好/更宽的散列分布。 在我看来,它会提高安全性。 这个假设是否正确?

OAuth规范在11.10熵的熵中提出了这个问题。

trans by 2019-08-07T21:46:35Z

new运算符 - 如何在Ruby中添加现有哈希

关于将一个key => value对添加到Ruby中的现有填充哈希,我正在通过Apress的Beginning Ruby工作,刚刚完成了哈希章节。

我试图找到用哈希实现相同结果的最简单方法,就像对数组一样:

x = [1, 2, 3, 4]
x << 5
p x
trans by 2019-08-07T19:45:56Z

红宝石 - 我如何比较两个哈希?

我试图使用以下代码比较两个Ruby Hashes:

#!/usr/bin/env ruby

require "yaml"
require "active_support"

file1 = YAML::load(File.open('./en_20110207.yml'))
file2 = YAML::load(File.open('./locales/en.yml'))

arr = []

file1.select { |k,v|
  file2.select { |k2, v2|
    arr << "#{v2}" if "#{v}" != "#{v2}"
  }
}

puts arr

屏幕输出是file2的完整文件。 我知道文件不同的事实,但脚本似乎没有拿起它。

trans by 2019-08-07T19:31:30Z

ruby - 使用哈希默认值时出现奇怪的,意外的行为(消失/更改值),例如:Hash.new([])

考虑以下代码:

h = Hash.new(0)  # New hash pairs will by default have 0 as values
h[1] += 1  #=> {1=>1}
h[2] += 2  #=> {2=>2}

这一切都很好,但是:

h = Hash.new([])  # Empty array as default value
h[1] <<= 1  #=> {1=>[1]}                  ← Ok
h[2] <<= 2  #=> {1=>[1,2], 2=>[1,2]}      ← Why did `1` change?
h[3] << 3   #=> {1=>[1,2,3], 2=>[1,2,3]}  ← Where is `3`?

在这一点上,我希望哈希是:

{1=>[1], 2=>[2], 3=>[3]}

但它远非如此。 发生了什么,我怎样才能得到我期望的行为?

trans by 2019-08-05T20:02:28Z

1 2 3 4 5 6 下一页 共6页