共同设计SWF?

| AIR允许使用Loader.LoadBytes()注入代码 这允许将远程插件下载为swf文件,从而可以完全访问AIR应用程序有权访问的所有内容。这带来了安全风险,因此希望对SWF进行数字签名。 做到这一点并验证代码签名的最佳方法是什么? 我知道as3corelib具有一些加密功能,也具有X.509证书的功能-但是我没有找到解释如何使用它的资源。另外,也许可以通过某种“官方”方式对SWF进行代码签名?     
已邀请:
        一种可靠的方法是使用公钥加密,它类似于以下内容: 您将需要非对称加密算法(例如RSA)和哈希算法(例如SHA,MD5)。 生成公私钥对。 使用哈希算法生成并校验数据。 使用加密算法使用私钥对校验和进行加密。这将成为“签名”。 将数据和签名一起发送给客户端。 使用公钥在客户端上解密签名以获得原始校验和。 根据客户端上的数据生成校验和。 比较校验和。如果它们匹配,那么您就知道数据来自您,没有任何更改。如果它们不匹配,那么您知道数据是在您发送或其他人发送后更改的。 参见http://en.wikipedia.org/wiki/Public-key_cryptography 如果攻击者能够拦截连接并修改原始客户端SWF文件并更改公钥或完全删除安全性机制,则可以绕过此安全性。使用TLS或SSL防止攻击者拦截数据。 x.509证书仅是与某些元数据捆绑在一起的公共密钥。该标准还指定了一种依靠证书颁发机构(CA)来验证证书的机制(请参阅http://en.wikipedia.org/wiki/X.509)。 AS3Crypto库(除其他外)提供RSA,MD5的实现和x.509解析器(请参见http://code.google.com/p/as3crypto/)。 这是一些代码。签名过程需要计算数据的哈希值,然后使用私钥对其进行签名以生成签名,例如:
var rsa:RSAKey;
var md5:MD5;
var data:ByteArray = getSWFBytes(); 
var signature:ByteArray = new ByteArray();
var originalHash:ByteArray;


// read private key
rsa = PEM.readRSAPrivateKey(private_key);

// create the checksum of the original data
md5 = new MD5();
originalHash = md5.hash(original);

// encrypt the data using the private key
rsa.sign(data, signature, original.length);
数据和签名发送到客户端。客户端使用存储在证书中的公钥解密签名,并将其与计算出的数据哈希进行比较,例如:
var rsa:RSAKey;
var md5:MD5;
var data:ByteArray = getSWFBytes(); 
var signature:ByteArray = new ByteArray();
var decryptedHash:ByteArray = new ByteArray();
var clientHash:ByteArray;

// load the certificate
var cert:X509Certificate = new X509Certificate(public_cert);

// get the public key from the cert
rsa = cert.getPublicKey();

// decrypt the signature with the public key
rsa.verify(signature, decryptedHash, encrypted.length);

// create a hash of the data
md5 = new MD5();
clientHash = md5.hash(data);

// compare the hashes
// isEqual compares the bytes in the input byte arrays, it returns true only of all bytes in both arrays match
if (isEqual(clientHash, decryptedHash))
    trace(\"signature valid\");
else
    trace(\"signature invalid\")
您可以像下面这样检查证书是否已签名:
var store:X509CertificateCollection = new MozillaRootCertificates();
var cert:X509Certificate = new X509Certificate(public_cert);
var isValid:Boolean = cert.isSigned(store, store);
您可以像这样加载原始SWF字节:
var loader:URLLoader = new URLLoader();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener(Event.COMPLETE, completeHandler);
loader.load(new URLRequest(url_of_swf_to_load));
示例x.509私钥(通常在您申请证书时创建):
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQDoKlLzpJeLcoPYQQYPa0diM4zpZ+0rKeRxhx9ssq91DzwAeSmM
7wT03WLiLZkqPt2MS3uNo75zK5RtmjHqF6Ojfs2tbSdlCK5tpisvOAssuq0o5vIz
g/MhS2PIijnBtVB9XFSTXxhveKeIq1VgdB2wHW95+zhBF+Z1hsYcNRRFFwIDAQAB
AoGAI8wK2EhjmXvBuoFkJtJ6wjiCnKaKmiIueBbGkKMIjLsZnFUSRAnCsOLF0WwI
dswUqwIkfdVmkymADFo/IgIdF9hLGNLRskIPKGZWEUC8d5ZJnRg+nuzi2c2msN5u
/BvCCgL5/shBhO5KvrPbU/Fbs/k4saCDQZ2EO4HpueRZWGkCQQD6hC0pTfyW4yQT
Qr/dY7FhOwdOh/8ewGyXBa9ruOuZqTR23Ya20O8NuF22+NqW9AZl7uioiTZyZkOV
jqAckelrAkEA7T9QVdK+QcaQSznrZPJpXlSIDLSBRWjaPKBoypnNTF3y3JkUQE0L
iA0c2oUc8D+LCgx9vA0Ai0IzwzrIec+iBQJAJb5YV4rKbalXPBeodKCajv2nwis3
QtjXA4H1xhMcXBBkOSxzKYQdIEIQzIp91JR7ikwOfaX+sAm8UQImGWfadQJAMAb4
KVePQluDDGd+OqJEKF9uZzwHS1jNjSZf8FuwTrxaFMQ8cEPoiLM22xnFYPFMIU2k
CnSLXqWZOvVkbhxVTQJAL3xIc5AUbhsEp7ZeeJrkPRv5rCObmLw0+wIaERtMX83b
PNM0TpzY6EXk+geTCqudAipYF/A7qn38wpOh+PuuVg==
-----END RSA PRIVATE KEY-----
证书示例:
-----BEGIN CERTIFICATE-----
MIID4zCCA0ygAwIBAgIJAL7k5X3sCvniMA0GCSqGSIb3DQEBBQUAMIGoMQswCQYD
VQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTERMA8GA1UEBxMIU2FuIEpvc2Ux
FDASBgNVBAoTC2h1cmxhbnQuY29tMRcwFQYDVQQLEw5hczMgY3J5cHRvIGxpYjEY
MBYGA1UEAxMPSGVucmkgVG9yZ2VtYW5lMSgwJgYJKoZIhvcNAQkBFhloZW5yaV90
b3JnZW1hbmVAeWFob28uY29tMB4XDTA3MTEwNTA1MjUyOVoXDTA4MTEwNDA1MjUy
OVowgagxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMREwDwYDVQQH
EwhTYW4gSm9zZTEUMBIGA1UEChMLaHVybGFudC5jb20xFzAVBgNVBAsTDmFzMyBj
cnlwdG8gbGliMRgwFgYDVQQDEw9IZW5yaSBUb3JnZW1hbmUxKDAmBgkqhkiG9w0B
CQEWGWhlbnJpX3RvcmdlbWFuZUB5YWhvby5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD
gY0AMIGJAoGBAOgqUvOkl4tyg9hBBg9rR2IzjOln7Ssp5HGHH2yyr3UPPAB5KYzv
BPTdYuItmSo+3YxLe42jvnMrlG2aMeoXo6N+za1tJ2UIrm2mKy84Cyy6rSjm8jOD
8yFLY8iKOcG1UH1cVJNfGG94p4irVWB0HbAdb3n7OEEX5nWGxhw1FEUXAgMBAAGj
ggERMIIBDTAdBgNVHQ4EFgQU/XyNp2QghYm3MWOU5YoUoFWcTKMwgd0GA1UdIwSB
1TCB0oAU/XyNp2QghYm3MWOU5YoUoFWcTKOhga6kgaswgagxCzAJBgNVBAYTAlVT
MRMwEQYDVQQIEwpDYWxpZm9ybmlhMREwDwYDVQQHEwhTYW4gSm9zZTEUMBIGA1UE
ChMLaHVybGFudC5jb20xFzAVBgNVBAsTDmFzMyBjcnlwdG8gbGliMRgwFgYDVQQD
Ew9IZW5yaSBUb3JnZW1hbmUxKDAmBgkqhkiG9w0BCQEWGWhlbnJpX3RvcmdlbWFu
ZUB5YWhvby5jb22CCQC+5OV97Ar54jAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEB
BQUAA4GBABsXUJjiRAz+FeiVq4JMSBWeiiGcXTw+8sNv8SfWaWx3su+AgooKlBn3
nsGKf3BEDdmJCOSgY0+A5Pce9SRoAMhabHKwoLEogrtp2p8vRj2OTMjWBW7ylrxj
FvUpFdc8qFaqTtgH6+JiIYllGFlcsSV+6d9fDPaFDZEHjz5GweWJ
-----END CERTIFICATE-----
这两个示例均来自as3crypto。     

要回复问题请先登录注册