我正在使用 Postgres 9.3 数据库作为 Web 应用程序的后端。我使用 PHP 5.5.7 连接到数据库并为前端 AJAX 调用返回 JSON。
我不是安全专家;但是,我熟悉 PHP 的新 password_*() 函数,并且非常了解幕后发生的事情。我也熟悉 Postgres 扩展 pgcrypto 和相关的 crypt() 函数。
我的问题是,使用 PHP 或 Postgres 来散列密码是否有意义?
我很好奇这些函数有何不同,所以我用 PHP 做了一个密码散列,然后将它交给 Postgres,看看 Postgres 是否使用相同的算法。在给定相同参数的情况下,与 PHP 相比,Postgres 返回了不同的结果(并非意外,但值得注意)。
password_hash('password', PASSWORD_BCRYPT, ["cost" => 15]);
输出: $2y$15$o8JufrnVXoob2NKiEGx6.uI4O2D4VcaAmY7WtNq5zPFiJow4KohGu
SELECT '$2y$15$o8JufrnVXoob2NKiEGx6.uI4O2D4VcaAmY7WtNq5zPFiJow4KohGu' = crypt('password', '$2y$15$o8JufrnVXoob2NKiEGx6.uI4O2D4VcaAmY7WtNq5zPFiJow4KohGu')
输出: false
鉴于这些过程不同,我想知道一个比另一个更好吗? 多一个还是少一个安全?
一些其他的想法:
我目前将所有逻辑都存储在数据库中(在 View 、函数、约束等中),所以如果我需要使用不同的前端,我不必担心丢失逻辑。在 PHP 中计算密码哈希实际上需要所有请求都通过 PHP 才能访问数据库。
另一方面,将逻辑放在数据库中可以让我灵活地使用其他连接选项;但是,所有 Postgres 查询都会被记录下来。由于复制中使用了 WAL,我无法禁用日志。这似乎是一个很大的安全漏洞。
我走的路对吗?我错过了什么?
我刚刚看了another message thread并找到了更多信息。
我们具有负载平衡功能的简单 Web 服务器可以解决这两个问题...
再一次,我走在正确的轨道上吗?我还缺少什么?
最佳答案
有关版本 2y 和 2a 之间的区别,请参阅此线程及其中的各种链接:
https://security.stackexchange.com/questions/20541/insecure-versions-of-crypt-hashes
我的理解是 PHP 中的 2a 实现存在问题 until v.5.3.8 ,尽管仅适用于包含非 ascii 字符的字符串。正如您所指出的,PgCrypto 出于某种原因不会“说”2y,我认为它会遇到这样的问题。 (也许将此报告为错误?)
除了后者提出的要点外,您在问题中指出了两者之间的主要安全差异:在数据库中系统地散列密码很方便,但意味着您以明文形式将其发送到数据库,在那里它可以如果您的数据库连接未加密,(并且将)被记录或完全被窥探。
在理想情况下,您甚至可以在将密码发送到 PHP 之前使用 javascript 在客户端应用程序中对密码进行哈希处理。下一个最好的办法是使用 SSL 将其发送到 PHP,然后在将其发送到数据库之前使用 PHP 对其进行哈希处理。
旁白:如果您出于某种原因需要互操作性,我非常确定 PHP 的 crypt 可以生成(安全的)2a 版本哈希。
关于PHP password_hash() 与 Postgres crypt(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20876644/
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
如何将lambda传递给hash.each,以便我可以重复使用一些代码?>h={a:'b'}>h.eachdo|key,value|end=>{:a=>"b"}>test=lambdado|key,value|puts"#{key}=#{value}"end>test.call('a','b')a=b>h.each&testArgumentError:wrongnumberofarguments(1for2)from(irb):1:in`blockinirb_binding'from(irb):5:in`each'from(irb):5from/Users/jstillwell/.rv
一边学习thisRailscast我从Rack中看到了以下源代码:defself.middleware@middleware||=beginm=Hash.new{|h,k|h[k]=[]}m["deployment"].concat[[Rack::ContentLength],[Rack::Chunked],logging_middleware]m["development"].concatm["deployment"]+[[Rack::ShowExceptions],[Rack::Lint]]mendend我的问题是关于第三行。什么是传递block{|h,k|h[k]=[]}到Has
在Ruby(或Rails)中,我们可以做到new_params=params.merge({:order=>'asc'})现在new_params是一个带有添加键:order的散列。但是是否有一行可以返回带有已删除key的散列?线路new_params=params.delete(:order)不会工作,因为delete方法返回值,仅此而已。我们必须分3步完成吗?tmp_params=paramstmp_params.delete(:order)returntmp_params有没有更好的方法?因为我想做一个new_params=(params[:order].blank?||para
一个对象的散列值是什么意思?在什么情况下两个对象具有相同的哈希值??还有说Array|Hash不能是Hashkeys,这个跟对象的hash值有关系,为什么? 最佳答案 对于要存储在HashMap或哈希集中的对象,必须满足以下条件:如果认为两个对象相等,则它们的哈希值也必须相等。如果两个对象不被认为是相等的,那么它们的哈希值应该很可能不同(两个不同的对象具有相同哈希值的次数越多,对HashMap/集合的操作性能就越差)。因此,如果两个对象具有相同的哈希值,则很有可能(但不能保证)它们相等。上面“相等”的确切含义取决于散列方法的实现者。
我有一个以时间戳为键的哈希。hash={"2016-05-31T22:30:58+02:00"=>{"path"=>"/","method"=>"GET"},"2016-05-31T22:31:23+02:00"=>{"path"=>"/tour","method"=>"GET"},"2016-05-31T22:31:05+02:00"=>{"path"=>"/contact_us","method"=>"GET"}}我订购了这个系列并得到了第一双这样的:hash.sort_by{|k,_|k}.first.first但是我该如何删除它呢?删除方法requiresyou知道key的准确
我有一个这样的数组[1,1,2,3,3,3,4,5,5]我想计算每个数字出现的次数,我正在尝试这样做[1,1,2,3,3,3,4,5,5].reduce(Hash.new(0)){|hash,number|hash[number]+=1}问题是当我尝试运行它时出现以下错误NoMethodError:undefinedmethod`[]='for1:Fixnumfrom(irb):6:in`blockinirb_binding'from(irb):6:in`each'from(irb):6:in`reduce'from(irb):6我能像这样设置初始值吗,还是我弄错了?