我很难找到一种方法来从 PHP 访问 Windows 上的安全随机数,这种方法很有可能在任何给定安装上工作。
许多 Windows 安装都没有 openssl 或禁用它,因此 openssl_random_pseudo_bytes() 通常不起作用。
当 mycrypt 扩展不可用时,mcrypt_create_iv() 会出现同样的问题。
session_id()(将 session.entropy_length 设置为合理的数字)是另一条路线,但安全模式有时会禁用重新生成和获取 session ID 所需的功能。
new COM('CAPICOM.Utilities.1')->GetRandom() 有点过时(仅限 Win32)并且 dll 不可靠。
new DOTNET('mscorlib', 'System.Security.Cryptography.RNGCryptoServiceProvider') with GetBytes() 仅在安装了 .NET 时才有效与 PHP 兼容。
什么是更好的解决方案?
最佳答案
我实际上实现了一个 RFC4086 PHP 中兼容的随机数生成器。您可以在 the GitHub Project for PHP-CryptLib 查看作品.
基本上,您指定所需的随机数/字符串的“强度”。如果您需要加密安全数字,请选择“高”(但请注意,这可能是一个阻塞操作。如果您只需要强度高的数字/字符串,我建议您使用“中”设置。如果您只是在实现一个没有安全隐患的游戏, 选择低。
下面是使用方法:
require_once dirname(dirname(__DIR__)) . '/lib/CryptLib/bootstrap.php';
$factory = new \CryptLib\Random\Factory;
$generator = $factory->getLowStrengthGenerator();
$number = $generator->generate(8);
这将生成一个低强度的 8 字节字符串(字符 0-255)(对于高强度,您可以执行 ->getHighStrengthGenerator)。不同之处在于它如何设置生成器(它使用哪个混音器,以及它使用哪个源)。
生成 1 到 10(含)之间的整数:
$int = $generator->generateInt(1, 10);
请注意,RFC4086 指定了一种从多个来源生成随机性的方法(这样,如果任何一个来源遭到破坏,最终结果都不会显着减弱)。因此,当您选择高强度来源时,它使用与中等来源相同的来源,但从高强度类别中添加了一个或多个来源。
请注意,根据 RFC,输出的强度至少与正在使用的最强的未妥协源一样好。因此,对于您可以获得的应用程序(设计),这确实是质量最好的 RNG...如果您想添加硬件 TRNG,您可以并且仍然使用该机制(源是可插入的,因此它应该能够在不损害输出的情况下添加任何东西)...
关于php - 从 PHP 访问 CryptGenRandom,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8553644/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah
我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以
我想从then子句中访问case语句表达式,即food="cheese"casefoodwhen"dip"then"carrotsticks"when"cheese"then"#{expr}crackers"else"mayo"end在这种情况下,expr是食物的当前值(value)。在这种情况下,我知道,我可以简单地访问变量food,但是在某些情况下,该值可能无法再访问(array.shift等)。除了将expr移出到局部变量然后访问它之外,是否有直接访问caseexpr值的方法?罗亚附注我知道这个具体示例很简单,只是一个示例场景。 最佳答案
我理解(我认为)Ruby中类变量和类的实例变量之间的区别。我想知道如何从该类外部访问该类的实例变量。从内部(即在类方法中而不是实例方法中),它可以直接访问,但是从外部,有没有办法做MyClass.class.[@$#]variablename?我没有任何具体原因要这样做,只是学习Ruby并想知道是否可行。 最佳答案 classMyClass@my_class_instance_var="foo"class上述yield:>>foo我相信Arkku演示了如何从类外部访问类变量(@@),而不是类实例变量(@)。我从这篇文章中提取了上述内
我试图在我的网站上实现使用Facebook登录功能,但在尝试从Facebook取回访问token时遇到障碍。这是我的代码:ifparams[:error_reason]=="user_denied"thenflash[:error]="TologinwithFacebook,youmustclick'Allow'toletthesiteaccessyourinformation"redirect_to:loginelsifparams[:code]thentoken_uri=URI.parse("https://graph.facebook.com/oauth/access_token
是否有可能以某种方式访问Class.new范围内的a?a=5Class.new{defb;aend}.new.b#NameError:undefinedlocalvariableormethod`a'for#:0x007fa8b15e9af0>#:in`b' 最佳答案 即使@MarekLipka的回答是正确的——改变变量范围总是有风险的。这是可行的,因为每个block都带有创建它的上下文,因此您的局部变量a突然变得不那么局部了——它变成了一个“隐藏的”全局变量:a=5object=Class.new{define_method(
使用散列定义的访问器方法动态创建对象的最简单方法是什么?例如,如果我有一个散列:{foo:"Foo",bar:"Bar"}我想要一个具有访问器方法foo、foo=、bar和bar=的对象,其初始值分别为"Foo"和"Bar"。我可以想到这样做:moduleObjectWithAccessordefself.newh;Struct.new(*h.keys).new(*h.values)endendo=ObjectWithAccessor.new(foo:"Foo",bar:"Bar")o.foo#=>"Foo"但是,我不需要它们的多个实例具有相同的特定键集,而是希望每次都使用可能不同的键
我在这方面尝试了很多URL,在我遇到这个特定的之前,它们似乎都很好:require'rubygems'require'nokogiri'require'open-uri'doc=Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))putsdoc这是结果:/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in`open_http':404NotFound(OpenURI::HT
我的Ruby-on-Rails项目中有以下文件结构,用于规范:/spec/msd/serviceservice_spec.rb/support/my_modulerequests_stubs.rb我的request_stubs.rb有:moduleMyModule::RequestsStubsmodule_functiondeflist_clientsurl="dummysite.com/clients"stub_request(:get,url).to_return(status:200,body:"clientsbody")endend在我的service_spec.rb我有:re