我有一个脚本从用户那里接收一些数据,然后返回一个散列的情况。在一定时间(比如 X 秒)内,散列有效,当与原始数据一起返回脚本并在指定时间范围内时,允许访问某些功能。
我通过在散列中包含时间戳来做到这一点。我可以通过调用 say floor(time()/X); 来获取时间戳,但这不是在 X 秒后过期,而是在 1 到 X 秒之间的任何时间过期。我通过保存 time()%X 并将其附加到散列来解决这个问题,然后当我收到它时,解析它并从 time() 中减去它,所以我的哈希函数看起来有点像这样:
function hash($oldhash='') {
static $hash;
if(!$hash) {
$time = time();
$expoff = explode('!', $oldhash, 2);
$expoff = $expoff[0] ? $expoff[0] : $time%$this->_cfg['hashexpire'];
$hash = $expoff.'!'.sha1($this->_data.floor(($time-$expoff)/$this->_cfg['hashexpire']));
}
return $hash;
}
里面还有盐,但为了清楚起见,我把它去掉了。
这行得通,但我认为可能有更好的方法来实现我在这里的目标,想知道您是否有任何建议。
最佳答案
那么,您希望它在一定秒数后过期,对吗?那么,为什么不预先计算过期时间,而是传递它呢?您只是在谈论正在传输的几个额外字节:
function makeHash() {
$expire = time() + $this->_cfg['hashexpire'];
$hash = $expire . ':' . hash_hmac('sha1', $this->_data, $expire);
return $hash;
}
然后验证:
function verifyHash($hash) {
if(!strpos($hash, ':')) return false;
list ($expire, $rawhash) = explode(':', $hash, 2);
$testhash = hash_hmac('sha1', $this->_data, $expire);
if ($expire < time() && $testhash == $rawhash) {
return true;
}
return false;
}
请注意,它使用的是 HMAC “签署”数据有效负载。
如果您真的对数据大小很疑虑,只需在将其发送到客户端之前base_convert($expire, 10, 36),然后在验证时对其进行解码。
编辑:在我重新阅读您的问题时,我不确定。您是否正在寻找将在 $x 秒后无效的散列?或者您是否希望为 $x 秒的绝对时间窗口生成相同的散列(之后散列会发生变化)?如果事先,上述解决方案将工作。如果是后者,那么你可以尝试这样的事情:
function makeHash() {
$time = time();
$startTime = $time - ($time % $this->_cfg['hashexpire']);
return hash_hmac('sha1', $this->_data, $startTime);
}
之所以可行,是因为它使用当前窗口第一个有效秒的时间戳进行哈希处理。这将始终保持不变,因此无需存储它或走得更远...
请注意,生成的哈希只会每 $_cfg['hashexpire'] 秒更改一次。但它可能会在创建后的一秒内失效。因此,只有在确实需要时才使用它。
关于php - 导致哈希在一定时间后过期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6036570/
我有一个这样的哈希数组:[{:foo=>2,:date=>Sat,01Sep2014},{:foo2=>2,:date=>Sat,02Sep2014},{:foo3=>3,:date=>Sat,01Sep2014},{:foo4=>4,:date=>Sat,03Sep2014},{:foo5=>5,:date=>Sat,02Sep2014}]如果:date相同,我想合并哈希值。我对上面数组的期望是:[{:foo=>2,:foo3=>3,:date=>Sat,01Sep2014},{:foo2=>2,:foo5=>5:date=>Sat,02Sep2014},{:foo4=>4,:dat
我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查
我使用Ember作为我的前端和GrapeAPI来为我的API提供服务。前端发送类似:{"service"=>{"name"=>"Name","duration"=>"30","user"=>nil,"organization"=>"org","category"=>nil,"description"=>"description","disabled"=>true,"color"=>nil,"availabilities"=>[{"day"=>"Saturday","enabled"=>false,"timeSlots"=>[{"startAt"=>"09:00AM","endAt"=>
这个问题在这里已经有了答案:Railsformattingdate(4个答案)关闭4年前。我想格式化Time.Now函数以显示YYYY-MM-DDHH:MM:SS而不是:“2018-03-0909:47:19+0000”该函数需要放在时间中.现在功能。require‘roo’require‘roo-xls’require‘byebug’file_name=ARGV.first||“Template.xlsx”excel_file=Roo::Spreadsheet.open(“./#{file_name}“,extension::xlsx)xml=Nokogiri::XML::Build
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
查看我的Ruby代码:h=Hash.new([])h[0]=:word1h[1]=h[1]输出是:Hash={0=>:word1,1=>[:word2,:word3],2=>[:word2,:word3]}我希望有Hash={0=>:word1,1=>[:word2],2=>[:word3]}为什么要附加第二个哈希元素(数组)?如何将新数组元素附加到第三个哈希元素? 最佳答案 如果您提供单个值作为Hash.new的参数(例如Hash.new([]),完全相同的对象将用作每个缺失键的默认值。这就是您所拥有的,那是你不想要的。您可以改用
假设我有一个在Ruby中看起来像这样的哈希:{:ie0=>"Hi",:ex0=>"Hey",:eg0=>"Howdy",:ie1=>"Hello",:ex1=>"Greetings",:eg1=>"Goodday"}有什么好的方法可以将它变成如下内容:{"0"=>{"ie"=>"Hi","ex"=>"Hey","eg"=>"Howdy"},"1"=>{"ie"=>"Hello","ex"=>"Greetings","eg"=>"Goodday"}} 最佳答案 您要求一个好的方法来做到这一点,所以答案是:一种您或同事可以在六个月后理解
我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时
我在搜索我的值是方法的散列时遇到问题。我只是不想运行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
我目前正在用Ruby编写一个项目,它使用ActiveRecordgem进行数据库交互,我正在尝试使用ActiveRecord::Base.logger记录所有数据库事件具有以下代码的属性ActiveRecord::Base.logger=Logger.new(File.open('logs/database.log','a'))这适用于迁移等(出于某种原因似乎需要启用日志记录,因为它在禁用时会出现NilClass错误)但是当我尝试运行包含调用ActiveRecord对象的线程守护程序的项目时脚本失败并出现以下错误/System/Library/Frameworks/Ruby.frame