2011-06-13 84 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取這兩個示例。