协调SWF?

时间:2011-06-13 19:14:02

标签: actionscript air code-signing

AIR允许使用Loader.LoadBytes()

注入代码

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

执行此操作并验证代码签名的最佳方法是什么?

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

1 个答案:

答案 0 :(得分:1)

一种强大的方法是使用公钥加密,如下所示:

  1. 您将需要非对称加密算法(例如,RSA)和散列算法(例如,SHA,MD5)。
  2. 生成公钥 - 私钥对。
  3. 使用哈希算法生成和校验数据。
  4. 使用加密算法使用私钥加密校验和。这成了“签名”。
  5. 将数据连同签名一起发送到客户端。
  6. 使用公钥解密客户端上的签名以获取原始校验和。
  7. 根据客户端上的数据生成校验和。
  8. 比较校验和。如果它们匹配,那么您就知道数据来自您而没有更改。如果它们不匹配,那么您知道数据是在您发送后更改的,或者来自其他人。
  9. 请参阅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。