论坛首页 Java企业应用论坛

AES搞定了3DES,又来了SSL,

浏览 10444 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-07-10  
前段时间做的系统,客户说server之间要用3DES加密,而我所有的通讯都用的是AES,找了好多资料告诉客户AES的加密算法要比3DES安全高级,最后终于说服客户了。

现在客户又提出了新的问题,说他们的头头部门要求client--server之间的通讯要用SSL加密。而他们是没有证书管理的,也就是说用无证书SSL来加密。这个变动对我的程序来说可不小,我都是用AES加密的。
我的C/S是TCP方式通讯的,在建立TCP连接开始时先由server端生成一个随机的128位key,传给client,然后client和server用这个Key来加密数据。在整个传输过程中socket都是不断的。
但他们比较青睐SSL,估计是以前做HTTP这块用惯了。
我从baidu上搜了一圈,遇到SSL多数都是HTTP的加密,而且就那么几篇文章到处转载。

抛开业务要求,从安全性上来说,TCP交互,有必要把AES改成SSL吗?
   发表时间:2008-07-11  
SSL协议通讯时候是对称算法的,可以使用AES128做期间的通讯。
只有密钥协商的时候才是非对称的。
你的通讯方式,要我说是很不合理的,第一个报文截取了,数据
就完全等于明文传输了,关键不是在传输过程采用什么样算法,
而是密钥的产生,保存,协商,确认才是最主要的。
0 请登录后投票
   发表时间:2008-07-11  
貌似手头有段ssl通信的代码,能满足要求么?拿到input和output就够了吧

try
        {
            javax.net.ssl.SSLSocketFactory factory = null;
            try
            {
                char passphrase[] = pswd.toCharArray();
                SSLContext ctx = SSLContext.getInstance("TLS");
	//证书类型可以根据实际情况填写
               KeyManagerFactory kmf = KeyManagerFactory.getInstance("IbmX509");
//证书类型可以根据实际情况填写
              TrustManagerFactory tmf = TrustManagerFactory.getInstance("IbmX509");
// ks_type是证书库的类型
                KeyStore ks = KeyStore.getInstance(ks_type);
                if(!(new File(keystore)).isFile())
                {
                    System.out.println("(ClientAuthA) Missing keyStore [" + keystore+ "]");
                    throw new IOException("Missing keystore = " + keystore);
                }
                ks.load(new FileInputStream(keystore), passphrase);
                kmf.init(ks, passphrase);
                tmf.init(ks);
                ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
                factory = ctx.getSocketFactory();
            }
            catch(Exception e)
            {
                e.printStackTrace();
                throw new IOException(e.getMessage());
            }
//根据ip和port建立连接
            SSLSocket socket = (SSLSocket)factory.createSocket(hostIP, hostPort);
            socket.setSoTimeout(timeout);
            socket.startHandshake();
            javax.net.ssl.SSLSession session = socket.getSession();
            if(session == null)
            {
                System.out.println("(ClientAuthA) Failed to get session context");
                throw new IOException("Failed to get session context");
            }
            java.io.InputStream is = null;
            java.io.OutputStream os = null;
            try
            {
                os = socket.getOutputStream();
            }
            catch(IOException e)
            {
                System.out.println("(ClientAuthA) Error getting output stream");
                throw new IOException("Error getting output stream");
            }
            try
            {
                is = socket.getInputStream();
            }
            catch(IOException e)
            {
                System.out.println("(ClientAuthA) Error getting input stream");
                throw new IOException("Error getting input stream");
            }
            istream = new BufferedReader(new InputStreamReader(is));
            ostream = new BufferedWriter(new OutputStreamWriter(os));
        }
        catch(Exception e)
        {
            if(e instanceof UnknownHostException)
            {
                e.printStackTrace(System.out);
                throw new IOException("Unknown Host Exception");
            }
            if(e instanceof IOException)
            {
                e.printStackTrace(System.out);
                throw new IOException(e.getMessage());
            } else
            {
                throw new RuntimeException(e.toString());
            }
0 请登录后投票
   发表时间:2008-07-11  
我的密钥传输使用RSA传输的,加密过程用的AES128,只不过当时没有用SSLSocket
不知道这个和SSLSocket区别多大
SSLSocket使用的时候服务端一定要先建立证书吗?
0 请登录后投票
   发表时间:2008-07-12  
证书,主要是对证书链上的所有人的身份确认,和信任关系的传递,
实际你用RSA作密钥传输中间采用AES加密数据是比较标准的做法之一。
SSH实际就是类似实现,不过密钥是采用的密码交换协议换取的。
如果有大量的客户需要做验证,那就要采用证书,验证双方身份,
如果点对点或少量用户的话完全没必要使用证书。你看你应用状况。
0 请登录后投票
   发表时间:2008-07-14  
我的详细的加密过程如下
1:client created RSA key pair
2:client sent RSA public key to Server
3:server generated an AES key (AESKey)
4:server sent RSA encrypted AESKey to client
5:client got AESKey with RSA decryption
6:client and server use AESkey to encrypt and decrypt net data

当初没有用SSLSocket做ssl流加密,主要考虑到我的很多程序构架都是Socket的,而在socket流传输上添加这套加密比较简单,把socket改成SSLSocket却很麻烦
客户现在不需要任何认证服务,只是保证网络数据不被修改和截取就可以了
可问题我的客户对加密不是很了解,他们曾几何时认同了SSL,现在就觉得ssl是安全的
我需要说服他们保持我这套加密过程
有没有什么文档或者资料可以证明这样的加密是安全的呢?只要搞定我的客户,我就可以睡个好觉了
谢谢

1 请登录后投票
   发表时间:2008-07-14  

ssl确实是比较安全的,但是ssl也和你加密没任何冲突啊。

ssl是对你现在的用的Socket的上层封装,对你的内部业务代码没任何影响。

ssl与你的加密方式是并存的。 相当于双重保护了。

0 请登录后投票
   发表时间:2008-07-14  
排除身份验证部分,楼主对数据加密的基本思路跟SSL是一致的。只是SSL可以对身份进行验证,比如说,如果有人恶意的伪造一个client来跟server进行通信,如果不采取其他的措施,楼主是没有办法确定双方的互信的。
0 请登录后投票
   发表时间:2008-07-16  
谢谢楼上的
目前客户这里是没有证书的,所以所谓的身份验证实际上是不存在的
问题是我需要说服客户采用我这样的加密方案
有没有什么办法证明这样的加密是可行的,或者能找到采用我这样的加密方式的大公司的产品来说明呢?
0 请登录后投票
   发表时间:2008-07-16  
建议你做一个表格,对比一下SSL和你的方式。因为你可以找到你的方式和SSL方式的相同点。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics