使用电子邮件地址作为 salt 是个坏主意吗?要密码吗?
最佳答案
编辑:
让我推荐给你这个answer on Security StackExchange其中解释了很多关于密码散列和 key 派生的细节。
底线:使用已建立的安全密码散列方案,该方案在某种程度上会占用大量资源以防止暴力攻击,但限制允许的调用次数以防止拒绝服务 (DoS) ) 攻击。
如果您的语言库有它的功能,请在升级时验证它是否做了它应该做的事情,特别是如果它是 PHP。
由于历史原因留下了下面的答案。
您可以使用用户的登录名作为盐,这可能比电子邮件地址更改的可能性更小(编辑: 0xA3 正确指出,这不如使用电子邮件地址,因为登录名往往更容易被猜到,而且有些登录名非常常用,因此彩虹表可能已经存在,或者可以重复用于其他站点)。
或者,有一个数据库列,您可以在其中保存密码的盐分。
但是,您也可以使用随机的用户特定盐,这更难猜测。
为了更好的安全性,您可以使用两种盐:一种特定于用户的盐和一种系统范围的盐(连接它们,然后使用密码对盐进行哈希处理)。
顺便说一句,盐和密码的简单连接可能不如使用 HMAC 安全.在 PHP 5 中,有 hash_hmac()您可以为此使用的功能:
$salt = $systemSalt.$userSalt;
hash_hmac('sha1', $password, $salt);
编辑:系统范围盐的基本原理:它可以而且应该存储在数据库之外(但备份。您将无法进行身份验证你的用户,如果你失去了它)。如果攻击者以某种方式读取您的数据库记录,他仍然无法有效地破解您的密码哈希值,直到他知道系统范围的加盐值。
编辑(稍微偏离主题):
关于密码哈希安全性的进一步说明:您可能还想阅读 Why do salts make dictionary attacks 'impossible'?关于多次散列以针对暴力破解和彩虹表攻击提供额外保护(尽管我认为重复散列可能会带来更多拒绝服务攻击的机会,除非您限制每次登录尝试的次数)。
注意
考虑到多用途多核系统(图形卡、可编程微 Controller 等)的兴起,可能值得使用具有高计算量的算法以及盐来对抗暴力破解,例如使用像 PBKDF2 这样的多重散列。但是,您应该限制每个时间单位的身份验证尝试次数,以防止 DDoS 攻击。
还有一件事:使用基于广泛使用的标准构建的“自定义”散列而不是广泛使用的预构建函数的另一个主要理由是 PHP 本身,它已证明自己不是在实现与安全相关的东西时完全值得信赖,无论是不太随机的随机数生成器还是 crypt() function that does not work at all在某些情况下,从而完全绕过了计算或内存密集型密码哈希函数应该带来的任何好处。
由于其确定性结果,简单的哈希函数比 key 派生函数的输出更有可能被正确测试,但您的里程数可能会有所不同。
关于php - 电子邮件地址作为密码盐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3787346/
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一
当我创建一个Rails应用程序时,控制台:railsnewfoo我的代码可以使用字符串“foo”吗?puts"Yourapp'snameis"+app_name_bar 最佳答案 Rails.application.class将为您提供应用程序的全名(例如YourAppName::Application)。从那里您可以使用Rails.application.class.parent获取模块名称。 关于ruby-on-rails-应用程序的名称是否可以作为变量使用?,我们在StackOve
我在搜索我的值是方法的散列时遇到问题。我只是不想运行plan_type与键匹配的方法。defmethod(plan_type,plan,user){foo:plan_is_foo(plan,user),bar:plan_is_bar(plan,user),waa:plan_is_waa(plan,user),har:plan_is_har(user)}[plan_type]end目前如果我传入“bar”作为plan_type,所有方法都会运行,我怎么能只运行plan_is_bar方法呢? 最佳答案 这个变体怎么样?defmethod
我正在尝试使用以下代码通过将ffmpeg实用程序作为子进程运行并获取其输出并解析它来确定视频分辨率:IO.popen'ffmpeg-i'+path_to_filedo|ffmpegIO|#myparsegoeshereend...但是ffmpeg输出仍然连接到标准输出并且ffmepgIO.readlines是空的。ffmpeg实用程序是否需要一些特殊处理?或者还有其他方法可以获得ffmpeg输出吗?我在WinXP和FedoraLinux下测试了这段代码-结果是一样的。 最佳答案 要跟进mouviciel的评论,您需要使用类似pope
有没有办法在Rails中为确认字段自定义消息?例如在设计中我必须输入密码和password_confirmation并且错误消息是:Passwordconfirmationdoesn'tmatchPassword我可以更改事件记录语言环境消息(“不匹配”),但它会在该语言环境消息的开头和结尾输出密码确认和密码,所以我得到如下内容:"PasswordconfirmationmustmatchPassword"有没有办法将其更改为不同的字符串?PasswordconfirmationandPasswordmustmatch.编辑另一件事是拥有完全自定义的消息,例如:'Setpassword
有没有办法跳过CSV文件的第一行,让第二行作为标题?我有一个CSV文件,第一行是日期,第二行是标题,所以我需要能够在遍历它时跳过第一行。我尝试使用slice但它会将CSV转换为数组,我真的很想将其读取为CSV,以便我可以利用header。 最佳答案 根据您的数据,您可以使用另一种方法和skip_lines-option此示例跳过所有以#开头的行require'csv'CSV.parse(DATA.read,:col_sep=>';',:headers=>true,:skip_lines=>/^#/#Markcomments!)do|
我想验证一个电子邮件地址是否是PayPal用户。是否有API调用来执行此操作?是否有执行此操作的ruby库?谢谢 最佳答案 GetVerifiedStatus来自PayPal'sAdaptiveAccounts平台会为您做这件事。PayPal没有任何codesamples或SDKs用于Ruby中的自适应帐户,但我确实找到了编写codeforGetVerifiedStatusinRuby的人.您需要更改该代码以检查他们拥有的帐户类型的唯一更改是更改if@xml['accountStatus']!=nilaccount_status
在纯Rubyirb中,不能输入{if:1}。该语句不会终止,因为irb认为if不是符号,而是if语句的开始。那么为什么Rails可以有before_filter接受if作为参数?该指南的代码如下:classOrderunless也会发生同样的事情。 最佳答案 这是一个irb问题,而不是Ruby。bash=>ruby-e"puts({if:1})"bash=#{:if=>1}您可以改用pry。它将正确读取输入。https://github.com/pry/pry 关于ruby-on-rai