在网上搜索和寻求帮助后,我现在正在创建一个 sha2 登录表单,我发现下面这个链接中的示例代码非常有用和实用(我希望我是对的!??),我唯一不知道的'理解是这个程序员编写函数并从函数中获取盐值的方式。
http://hungred.com/useful-information/php-better-hashing-password/
define('SALT_LENGTH', 15);
function HashMe($phrase, &$salt = null)
{
$pepper = '!@#$%^&*()_+=-{}][;";/?<>.,';
if ($salt == '')
{
$salt = substr(hash('sha512',uniqid(rand(), true).$pepper.microtime()), 0, SALT_LENGTH);
}
else
{
$salt = substr($salt, 0, SALT_LENGTH);
}
return hash('sha512',$salt . $pepper . $phrase);
}
如果我把函数改成这个有什么区别?
function HashMe($phrase, $salt) {..}
当然这个函数会失败,$salt前加一个'&'有什么用?有必要像这样 &$salt = null 吗?如果我输入 '&$salt' 会怎么样?
然后,要获取盐值,您可以直接将其放入如下的 sql 查询中,
$username = cleanMe($_POST('username'));
$password = cleanMe($_POST('password'));
$salt = '';
$hashed_password = HashMe($password, $salt);
$sqlquery = 'INSERT INTO `usertable` ("username", "password", "salt") VALUES ("'.$username.'", "'.$hashed_password .'", "'.$salt.'") WHERE 1';
..
在准备 sql 查询之前,如何从下面的函数中获取盐值,
$salt = "'".salt."'";
$username = "'".$username."'";
$hashed_password = "'".$hashed_password."'";
然后,
$sqlquery = 'INSERT INTO `usertable` ("username", "password", "salt") VALUES ($username, $hashed_password, $salt) WHERE 1';
我不喜欢/不想在我的 sql 查询中使用这个 - "'"的原因是我有时有 null 值,比如 $firstname = 'NULL';如果名字为空/空,我希望该行将空字段“勾选”为空。
此外,在我的 sql 查询中有“'”,当出现问题时让我头晕并且难以调试......
抱歉,我在这个帖子中有很多问题!
谢谢。
最佳答案
让我们看看我能否一次一个地回答您的问题。
首先,您问为什么 function HashMe($phrase, $salt) 失败,而 function HashMe($phrase,&$salt = null) 却没有。解释完第二部分和第三部分后,这一点就会变得清楚。
其次,您问为什么在函数声明中 $salt 之前需要 &。 & 的意思是您正在通过引用 传递值。通常,当您将一个值传递给一个函数时,会创建该值的一个副本,您可以处理该副本。例如:
function addOne($number){
$number = $number + 1;
}
$myNumber = 3;
addOne($myNumber);
echo $myNumber;
此代码将输出 3,而不是 4。这是因为该函数不会更改 $myNumber,它会创建它的副本并更改该副本。当您通过引用传递时,您告诉它处理原始数字而不是创建副本。因此,如果我们做这个微小的改变:
function addOne(&$number){
$number = $number + 1;
}
$myNumber = 3;
addOne($myNumber);
echo $myNumber;
现在我们的代码输出4。该函数通过引用传递 $salt,因为它更改了 $salt 的值。因此,在函数运行后,您现在有了 $salt 的新值。
至于为什么需要&$salt = null,那是你不自己声明变量就自动声明了。因此,如果您只想生成一个随机散列(无法重新创建它,因为您不知道使用了什么盐),您可以使用 HashMe("message to hash");。 = null 表示如果没有第二个参数,则自动将第二个参数设置为“null”。然而,在代码的后面,它表示如果第二个参数为“null”,则生成一个随机盐:
if ($salt == '')
{
$salt = substr(hash('sha512',uniqid(rand(), true).$pepper.microtime()), 0, SALT_LENGTH);
}
因此,如果您以这种方式调用该函数,您将创建一个您可能永远无法重现的散列。
对于您的第四个问题,您希望获取 $salt 的值以用于 SQL 查询。这就是引用传递的美妙之处。由于变量 $salt 是通过引用传递的,因此在函数运行后您可以再次使用 $salt 并且它将具有新值。需要注意的一件重要事情是,更改 $salt 的所有功能都是确保它的长度为 15 个字符。任何较长的内容都会被截断,但任何较短的内容都将保持不变。因此,如果您存储函数返回的(15 个字符)盐,您可以在将来使用它并且不会再次更改盐。因此,您的 SQL 查询应该可以完美运行。
$sqlquery = "INSERT INTO `usertable` ('username', 'password', 'salt') VALUES ($username, $hashed_password, $salt) WHERE 1";
请注意,我交换了您原始查询中的双引号和单引号。这是因为在某些版本的 PHP 中,变量不会在单引号中被解析。例如:
$secret = "Hello, there";
echo '$secret'; // "$secret"
echo "$secret"; // "Hello, there"
关于PHP 安全 sha2 : &$salt = null?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3898755/
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
我正在编写一个小脚本来定位aws存储桶中的特定文件,并创建一个临时验证的url以发送给同事。(理想情况下,这将创建类似于在控制台上右键单击存储桶中的文件并复制链接地址的结果)。我研究过回形针,它似乎不符合这个标准,但我可能只是不知道它的全部功能。我尝试了以下方法:defauthenticated_url(file_name,bucket)AWS::S3::S3Object.url_for(file_name,bucket,:secure=>true,:expires=>20*60)end产生这种类型的结果:...-1.amazonaws.com/file_path/file.zip.A