2011-06-14 68 views
0

我正在使用RSA sign()函数来生成专用流的签名URL。我正在测试PHP代码,但我想在Flex中重新编写代码。这里是PHP代码的一部分:RSA登录功能问题

function getCannedPolicy($resource, $expires, $key, $privatekeyfile){ 
     $priv_key = file_get_contents($privatekeyfile); 
     $pkeyid = openssl_get_privatekey($priv_key); 
     $policy_str = '{"Statement":[{"Resource":"'.$resource.'","Condition":{"DateLessThan":{"AWS:EpochTime":'.$expires.'}}}]}'; 
     $policy_str = trim(preg_replace('/\s+/', '', $policy_str)); 
     $res = openssl_sign($policy_str, $signature, $pkeyid, OPENSSL_ALGO_SHA1); 
     $signature_base64 = (base64_encode($signature)); 
     $repl = array('+' => '-','=' => '_','/' => '~'); 
     $signature_base64 = strtr($signature_base64,$repl); 
     $url = $resource . '?Expires='.$expires. '&Signature=' . $signature_base64 . '&Key-Pair-Id='. $key; 

     return $url; 
} 

我在Flex中编写了相同的函数。以下是代码:

private function getCannedPolicy(resource:String, expires:uint, key:String, privatekey:String):String{   
    var unsigned:String = '{"Statement":[{"Resource":"' +resource+ '","Condition":{"DateLessThan":{"AWS:EpochTime":' +expires+ '}}}]}'; 
    var signed:String = ''; 
    var signature:String = ''; 
    var regex:RegExp = /\s+/g;   
    unsigned = unsigned.replace(regex,''); 
    var src:ByteArray = new ByteArray();    
    src.writeUTFBytes(unsigned);    
    var dst:ByteArray = new ByteArray();    
    var hash:SHA1 = new SHA1(); 
    src = hash.hash(src);      
    var rsa:RSAKey = PEM.readRSAPrivateKey(privatekey); 
    trace(rsa.dump()); 
    rsa.sign(src, dst, src.length); 
    dst.position = 0;   
    signature = Base64.encodeByteArray(dst);        
    signature = signature.split("+").join("-"); 
    signature = signature.split("=").join("_"); 
    signature = signature.split("\/").join("~"); 
    signed = resource+'?Expires=' +expires+ '&Signature=' +signature+ '&Key-Pair-Id=' +key; 

    return signed; 
} 

两个函数(PHP和Flex)的输出格式相同。但是,当我使用Flex功能中的签名URL时,该流不起作用。

我使用openssl_sign替代() PHP函数是as3crypto库号()功能。也许这是问题?也许加密是不同的。

+0

如果两个实现都创建相同的结果w /相同的数据;那么这个问题要么是两个函数都有错误,要么不是两个函数都有问题。当你说“流不工作”你是什么意思?你如何在PHP中使用它?你如何在Flex中使用它?你有编译错误吗?或运行时错误? – JeffryHouser 2011-06-14 14:56:45

+0

签名的url包含参数** expire **,所以如果日期到期,url无效。我正在使用JW播放器进行流式传输,并且我正在通过flashvars为jw播放器设置签名的url。对于相同的格式,我的意思是这两个函数返回相同长度的相同参数和签名。当我从flex函数中放置签名的url时,JW播放器说:Stream not found! (这发生在日期过期或签名与策略不匹配的情况下,我认为第二个是)我的问题是:我可以使用as3crypto中的RSAKey.sign()而不是openssl_sign()php函数吗?谢谢! – ExtremeBt 2011-06-14 15:05:42

+0

为什么你会选择签署一些客户端,当它可以(并应该)完成服务器端?公共客户本质上是不安全的,几乎没有任何情况下将安全责任交给客户是有道理的。客户端只负责收集和显示服务器的数据(如果安全性问题,则通过SSL)。这当然只适用于客户端 - 服务器体系结构... – drkstr 2011-06-14 15:38:46

回答

0

不幸的是,as3crypto的RSAKey.sign()是不相同的功能,PHP的openssl_sign()。他们的输出是不同的签名。出于这个原因,我决定调用远程php函数来生成我的签名。它现在有效!