2011-06-13 110 views
1

AIR允许使用注入代码Loader.LoadBytes()对SWF进行编码签名?

这允许远程下载的插件,这将有完全访问权限的AIR应用程序可以访问所有的SWF文件。这带来了安全风险,因此需要对swf进行数字签名。

什么是最好的方式来做到这一点,并验证代码签名?

我知道as3corelib具有一些加密功能,也适用于X.509证书 - 但我没有找到解释如何使用它的资源。另外,也许有一些'官方'的方式来协调SWF的?

回答

1

一种可靠的方法是使用公共密钥加密,它是这样的:

  1. 您将需要一个非对称加密算法(例如,RSA)和散列算法(例如,SHA,MD5)。
  2. 生成公钥 - 私钥对。
  3. 使用散列算法生成和校验和数据。
  4. 使用加密算法使用私钥加密校验和。这成为“签名”。
  5. 将数据和签名一起发送到客户端。
  6. 使用公钥解密客户端上的签名以获取原始校验和。
  7. 从客户端上的数据生成校验和。
  8. 比较校验和。如果它们匹配,那么你知道这些数据来自你而没有改变。如果它们不匹配,那么您知道数据在您发送后发生了改变,或者来自其他人。

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取这两个示例。