是谁把Adobe数字签名的RSL存放到FlashPlayer指定的缓存当中的?
是Flex框架吗?经过试验,这是FlashPlayer自动为我们做的。
>>FlashPlayer的缓存在哪里?
(1)。XP系统
C:/Documents and Settings/用户名/Application Data/Adobe/Flash Player/AssetCache/H7UC3H3Y
(2)。VISTA和WIN7
C:/Users/用户名/AppData/Roaming/Adobe/Flash Player/AssetCache/RAU4Y963
这两个路径的最后一个文件夹名是随机的,另外拷贝过去的swz文件也需注意,它是类似于ABD49354324081CEBB8F60184CF5FEE81F0F9298.swz 这样的名字。似乎是截取自于该文件的数字签名。
>>为了使用RSL,我们要做些什么?FlashPlayer又会为我们做些什么?
Adobe数字签名的RSL(*.swz)文件必须由我们编写代码来下载。 -------- 对于Flex而言,SystemManager负责启动RSL(*.swz)的下载。
下载完毕之后,我们不需要编写任何代码,FlashPlayer会自动把它们存放到FlashPlayer指定的缓存当中。
>>如何验证?
首先清空上述FlashPlayer缓存。
然后,通过FlashBuilder我们建立ActionScript工程:TestRslSave
然后,把 framework_4.6.0.23201.swz 文件手工放置在Debug-Bin目录下。
最后编译并执行下面的程序,看FlashPlayer缓存,你会发现多了三个文件。
(1)。ABD49354324081CEBB8F60184CF5FEE81F0F9298.swz ---- 它就是framework_4.6.0.23201.swz
(2)。ABD49354324081CEBB8F60184CF5FEE81F0F9298.heu
(3)。cacheSize.txt
下面的代码没有文件的磁盘读些操作,因此可以认定:swz文件是FlashPlayer帮我们放入其缓存的。
TestRslSave.as
注意:下载Adobe数字签名的swz文件的时候,myURLReq.digest必须设定
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.IOErrorEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.text.TextField;
public class TestRslSave extends Sprite
{
private var txt1:TextField;
public function TestRslSave()
{
txt1 = new TextField();
addChild(txt1);
var myURLReq:URLRequest = new URLRequest();
myURLReq.url = "framework_4.6.0.23201.swz";
myURLReq.digest = "abd49354324081cebb8f60184cf5fee81f0f9298e64dbec968c96d68fe16c437";
var myURLLoader:URLLoader = new URLLoader();
myURLLoader.addEventListener(Event.COMPLETE, onComplete);
myURLLoader.addEventListener(IOErrorEvent.IO_ERROR, onErrorHandler);
myURLLoader.load(myURLReq);
}
function onComplete(event:Event) {
txt1.text="onComplete";
}
function onErrorHandler(event:IOErrorEvent) {
txt1.text=event.toString();
}
}
}
>>必要的解释
(1)。myURLReq.digest
首先请参考《ActionScript 3.0 语言和组件参考》中对于URLRequest的成员变量digest的说明。摘要如下:
digest | 属性 |
digest:String
[读写]
语言版本: | ActionScript 3.0 |
运行时版本: | AIR 1.0, Flash Player 9.0.115.0 |
唯一地标识将存储到 Flash Player 缓存中(或从中检索)的已签名 Adobe 平台组件的字符串。Adobe 平台组件是一个签名文件(SWZ 文件),其中包含永久缓存在用户计算机上的 SWF 内容。Adobe 对所有 SWZ 进行签名。摘要对应于单个缓存文件;如果对该文件进行了任何更改,则其摘要的更改将以不可预知的方式进行。通过使用摘要,您可以跨多个域验证缓存文件。具有相同摘要的两个文件是同一个文件,具有不同摘要的两个文件是不同的文件。实际上无法创建文件来“窃听”摘要以假装是另一个摘要。此属性仅适用于 SWF 内容,不适用于在 AIR 中运行的 JavaScript 代码。
摘要基于 SHA-256 消息摘要算法(长度为 64 个字符,采用十六进制格式)。
例如,Flex SDK 包括 Flex 框架的 SWZ(而且它为该 SWZ 文件提供了摘要字符串)。可以将此 SWZ 发布到您的 Web 服务器上并加载到 SWF 文件中(使用 URLLoader 对象的 load()
方法)。如果最终用户的计算机已缓存了匹配的 SWZ 文件,则应用程序将使用此缓存的 SWZ 文件。(SWZ 文件在其 digest
与您提供的摘要匹配时匹配。)否则,应用程序将从您指定的 URL 下载 SWZ 文件。
仅在 URLLoader.load()
方法调用中使用的 URLRequest 对象中设置 digest
参数即可加载 SWZ 文件。如果 URLRequest 对象的 digest
属性在用于其它方法时进行了设置,则应用程序将引发 IOError 异常。
(2)。myURLReq.digest = "abd49354324081cebb8f60184cf5fee81f0f9298e64dbec968c96d68fe16c437";
这串字符代表framework_4.6.0.23201.swz的数字摘要。上述示例执行过程中,FlashPlayer会“暗地里”计算framework_4.6.0.23201.swz的数字摘要,然后和这串字符作比较。如果不同,则报错。
我们的示例程序是如何预先得知这个字符串的呢?
任意为某个Flex工程增加编译参数: keep-generated-actionscript=true
则编译该工程后,会出现文件夹generated。
在其中找到名字类似于_XXXXXXX_mx_managers_SystemManager-generated.as的代码文件。
察看代码可以找到类似于下面的内容,你发现了什么?
[new RSLData("http://fpdownload.adobe.com/pub/swz/flex/4.6.0.23201/framework_4.6.0.23201.swz",
"http://fpdownload.adobe.com/pub/swz/crossdomain.xml",
"abd49354324081cebb8f60184cf5fee81f0f9298e64dbec968c96d68fe16c437",
"SHA-256",true,true,"default"),
new RSLData("framework_4.6.0.23201.swz",
"",
"abd49354324081cebb8f60184cf5fee81f0f9298e64dbec968c96d68fe16c437",
"SHA-256",true,true,"default")],
>>引申思考:
是谁把非数字签名的RSL放入了浏览器缓存?