锁定老帖子 主题:AES搞定了3DES,又来了SSL,
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-10
现在客户又提出了新的问题,说他们的头头部门要求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吗? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-07-11
SSL协议通讯时候是对称算法的,可以使用AES128做期间的通讯。
只有密钥协商的时候才是非对称的。 你的通讯方式,要我说是很不合理的,第一个报文截取了,数据 就完全等于明文传输了,关键不是在传输过程采用什么样算法, 而是密钥的产生,保存,协商,确认才是最主要的。 |
|
返回顶楼 | |
发表时间: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()); } |
|
返回顶楼 | |
发表时间:2008-07-11
我的密钥传输使用RSA传输的,加密过程用的AES128,只不过当时没有用SSLSocket
不知道这个和SSLSocket区别多大 SSLSocket使用的时候服务端一定要先建立证书吗? |
|
返回顶楼 | |
发表时间:2008-07-12
证书,主要是对证书链上的所有人的身份确认,和信任关系的传递,
实际你用RSA作密钥传输中间采用AES加密数据是比较标准的做法之一。 SSH实际就是类似实现,不过密钥是采用的密码交换协议换取的。 如果有大量的客户需要做验证,那就要采用证书,验证双方身份, 如果点对点或少量用户的话完全没必要使用证书。你看你应用状况。 |
|
返回顶楼 | |
发表时间: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是安全的 我需要说服他们保持我这套加密过程 有没有什么文档或者资料可以证明这样的加密是安全的呢?只要搞定我的客户,我就可以睡个好觉了 谢谢 |
|
返回顶楼 | |
发表时间:2008-07-14
ssl确实是比较安全的,但是ssl也和你加密没任何冲突啊。 ssl是对你现在的用的Socket的上层封装,对你的内部业务代码没任何影响。 ssl与你的加密方式是并存的。 相当于双重保护了。 |
|
返回顶楼 | |
发表时间:2008-07-14
排除身份验证部分,楼主对数据加密的基本思路跟SSL是一致的。只是SSL可以对身份进行验证,比如说,如果有人恶意的伪造一个client来跟server进行通信,如果不采取其他的措施,楼主是没有办法确定双方的互信的。
|
|
返回顶楼 | |
发表时间:2008-07-16
谢谢楼上的
目前客户这里是没有证书的,所以所谓的身份验证实际上是不存在的 问题是我需要说服客户采用我这样的加密方案 有没有什么办法证明这样的加密是可行的,或者能找到采用我这样的加密方式的大公司的产品来说明呢? |
|
返回顶楼 | |
发表时间:2008-07-16
建议你做一个表格,对比一下SSL和你的方式。因为你可以找到你的方式和SSL方式的相同点。
|
|
返回顶楼 | |