目前正在编写自己的AMF TcpSocketServer。到目前为止,一切都很好,我可以发送和接收对象,我使用一些序列化/反序列化代码。现在我开始研究加密代码,我对这些东西并不熟悉。
我使用:http://code.google.com/p/as3crypto/作为加密/解密库。我写了一个Async tcp服务器,滥用了线程池;)
无论如何这里有一些代码:
C#crypter初始化代码
System.Security.Cryptography.DESCryptoServiceProvider crypter = new DESCryptoServiceProvider();
crypter.Padding = PaddingMode.Zeros;
crypter.Mode = CipherMode.CBC;
crypter.Key = Encoding.ASCII.GetBytes("TESTTEST");
AS3
private static var _KEY:ByteArray = Hex.toArray(Hex.fromString("TESTTEST"));
private static var _TYPE:String = "des-cbc";
public static function encrypt(array:ByteArray):ByteArray
{
var pad:IPad = new NullPad;
var mode:ICipher = Crypto.getCipher(_TYPE, _KEY, pad);
pad.setBlockSize(mode.getBlockSize());
mode.encrypt(array);
return array;
}
public static function decrypt(array:ByteArray):ByteArray
{
var pad:IPad = new NullPad;
var mode:ICipher = Crypto.getCipher(_TYPE, _KEY, pad);
pad.setBlockSize(mode.getBlockSize());
mode.decrypt(array);
return array;
}
C#读取/取消序列化/解密代码
public override object Read(int length)
{
object d;
using (MemoryStream stream = new MemoryStream())
{
stream.Write(this._readBuffer, 0, length);
stream.Position = 0;
if (this.Decrypter != null)
{
using (CryptoStream c = new CryptoStream(stream, this.Decrypter, CryptoStreamMode.Read))
using (AmfReader reader = new AmfReader(c))
{
d = reader.ReadAmf3Object();
}
}
else
{
using (AmfReader reader = new AmfReader(stream))
{
d = reader.ReadAmf3Object();
}
}
}
return d;
}
答案 0 :(得分:1)
定义“安全”。
DES比纯文本更安全,但由于它是56位密钥,因此通常不再使用它。如果你正在保护数据不受你的家人的影响,或者是随意的轻松滴管,这可能没问题。
如果人们现在使用DES,那么它就是Triple DES,它基本上在每个数据块上运行DES三次。
现在选择对称加密算法(DES)的是AES,它就像是DES的精神继承者。
具有256的足够大的密钥(现在真的是512或更高)的AES在大多数应用程序中都是加密安全的。
AES的几点注意事项是:
关于您的错误,请先尝试切换到AES,然后查看是否仍有问题。
关于AES:
密钥选择很重要,还有密钥保护。
密钥选择
如果您想使用AES“密码”保护您的数据,则需要将密码转换为AES密钥。这是许多业余计算机安全开发人员常见的陷阱。通过使用用户密码的MD5哈希作为密钥,Adobe基本上破坏了其PDF中的AES的所有保护。毋庸置疑,你比Adobe的所有工程师都聪明,所以你不会犯这个错误。
从密码生成密钥的正确方法是使用RFC2898又名PBKD2(基于密码的密钥派生函数)。 .NET方便地使用一种方法:Rfc2898DeriveBytes()。基本上它的作用是以加密方式安全地散列您的密码,使用提供的盐(更多内容),多次,由用户提供。这提供了几个层来防止对您的密码的暴力攻击(假设您的密钥足够大,以防止暴力攻击它!)
PBKD2的每次迭代都需要很短的时间才能运行。您运行的交互越多(我认为建议的数字> 1000),计算机所需的时间就越多。这个时间仍然比人类所认识的要少,但在计算机时代,它就像一个世纪。因此,在不知道确切的迭代次数的情况下,它会使暴力破解密码成为一个非常漫长的过程。
盐。 salt不是直接对密码进行哈希,而是在输入密码中添加额外信息,从而创建唯一的哈希值。假设您保持盐值受到保护,这可以防止彩虹表攻击。
密钥存储
密码学的另一面是密钥存储。如果您使用密码保护数据,则需要安全地存储密码。最简单的方法是使用操作系统的内置安全性。在Windows上使用注册表中的DPAPI和Unix,filepermissions。
AES作为会话密钥
如果您希望通过非安全通道安全地传输数据(甚至在SSL上添加自己的额外安全性),您可能希望将AES用作会话加密。
本质上,这是两个方案加密系统,其工作方式如下:
您可以使用自己喜欢的不对称加密(RSA!)为您的服务器生成公钥/私钥对。 每个可信客户端都有公钥。 在会话期间,客户端生成256位或更高位的新随机AES密钥。 此AES会话密钥使用公共RSA密钥加密。 包含AES会话密钥的加密数据被发送到服务器。 服务器使用其私有RSA密钥对数据进行解密,并保留AES会话密钥。 在会话的剩余时间内,所有数据都使用会话AES密钥进行加密。 在会话结束时,AES密钥将被丢弃。
虽然这确实需要更多握手,但这可以为您提供额外的保护,以限制曝光。由于AES密钥仅适用于会话,因此如果发现它,则损坏仅限于一次会话。
答案 1 :(得分:0)
DES是一种分组密码,因此通常它使得使用字节更加繁琐。 AS3是一个主要用于GSM电话系统的流密码,因为它是一个流密码,它可以很好地处理字节。
就个人而言,如果真的需要使用流密码,我会使用RC4;这很快。这里有一个很好的实现http://dotnet-snippets.com/dns/rc4-encryption-SID577.aspx
使用流密码时,您应该注意一些非常重要的注意事项:
1)从不使用流密码重新使用加密密钥。
2)因为您一次加密一个字节,所以很难确定数据是否已被篡改,因此您需要向流添加数字签名或HMAC。