Flash与 .Net服务器之间只有HTTP连接的情况下,可以通过RSA加密来保障通信的安全。
首先服务器生成一对密钥,把公钥返回给页面.
using System.Security.Cryptography;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
RSAParameters rsaParam = rsa.ExportParameters(false);
// BA039FFB7657237FAFC78332473483D430396F7B37DD4982B78D200089CEF5738589E2D016FD8B03434DE4B67D1EC7ABF53BE4CC94A0D1E29C36F486DF1A5C6D46AF78F4E2BE1FCB0FEAD6173C7E82B788F307A0019584288A9B3F7EADCD1925CF48FC622FA80E0BC944E2F030B87BB2A2898BC03D38574302C047BB29758279
string modulus = BitConverter.ToString(rsaParam.Modulus).Replace("-", string.Empty);
// 010001
string exponent = BitConverter.ToString(rsaParam.Exponent).Replace("-", string.Empty);
// 将 modulus / exponent 传回到客户端
}
页面上加载Flash,可以采用flashvar的方式将modulus/exponent传送到flash中。
Flash工程中引入 as3crypto 这个开源的加解密开发包 http://code.google.com/p/as3crypto/
下面是示例ActionScript3代码进行加密:
import com.hurlant.crypto.rsa.RSAKey;
import flash.utils.ByteArray;
// 加密字符串
// 返回值:加密后的ByteArray
private function encrypt(toBeEncrypted:String) : ByteArray {
var input : ByteArray = new ByteArray();
input.writeUTFBytes(info);
// 初始化RSAKey, 从flashvars中读取服务器生成的 modulus / exponent
var rsa : RSAKey = RSAKey.parsePublicKey( this.loaderInfo.parameters["modulus"]
, this.loaderInfo.parameters["exponent"]);
// 加密
var dest : ByteArray = new ByteArray();
rsa.encrypt( input, dest, input.length, null);
return dest;
}
Flash通过HTTP请求的方式将ByteArray传送到服务器。
服务器就直接使用最初生成的私钥解密:
using( RSACryptoServiceProvider rsa = new RSACryptoServiceProvider() )
{
// 读取之前保存的密钥
string file = HostingEnvironment.MapPath("rsa_key.xml");
using (StreamReader sr = new StreamReader(file))
{
rsa.FromXmlString(sr.ReadToEnd());
}
// 解密
byte [] plainTextBytes = rsa.Decrypt( info, false);
string info = Encoding.UTF8.GetString(plainTextBytes, 0, plainTextBytes.Length);
}
为了防范报文重放攻击(Package-repeat attack), 每次都应该重新生成密钥对--一个RSA key只运行进行一次加解密。
如果需要对大数据量进行加密,则应该结合AES等对称加密算法,在密钥协商的时候采用RSA,而真正的数据采用AES加解密。
本文原始地址:http://blog.youkuaiyun.com/wangjia184/article/details/8274785