使用SSL来实现安全加密通讯需要有密码对及公钥证书等..
JDK中自带的一个工具keytool就可以用来生成密钥对..管理密码仓库以及证书的导入导出..
keytool的默认路径在~\java\jdk1.7.0\bin\下..以下介绍keytool的几种基本应用..
1)创建服务端密钥库
>keytool -genkey -keystore d:\serverkey.jks -keyalg rsa -alias ssl1 -validity 700
上述命令中:
-genkey 生成密钥对
-keystore 指定密码仓库的文件地址
-keyalg 密钥所使用的算法
-alias 密钥别名..使用密钥时是使用此别名来区分的
-validity 密钥有效期(天)..从当前系统时间开始计算
该命令成功后会要求输入密码仓库的密码..例如111111
然后是输入你的个人信息..
最后会要求输入别名的密码..例如222222
创建成功后..在建立服务端的SSL连接时用下述方法导入密钥..
String keyFile = serverkey.jks
String keyFilePass = "111111"
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keyFile), keyFilePass.toCharArray());
再利用该密码仓库来进行相应操作..
2)将服务端的公钥导出成证书
>keytool -export -alias ssl1 -file d:\ssl1.cer -keystore d:\serverkey.jks
-export 导出
导出成功后就得到了ssl1.cer这一份证书了..然后就是要将这一份证书分发给客户端..客户端有了该证书后就能与服务端建立安全连接了..
3)生成客户端的密钥仓库
方法与1)类似..
4)将*.cer导入到客户端的密钥仓库里
>keytool -import -file d:\ssl1.cer -keystore d:\clientkey.jks
-import 导入
上述命令成功后会要求输入客户端密钥仓库的密码..
成功后在每次要访问服务端之前还要将该证书添加到受信域中..系统会自动从受信域中检查可用的证书来完成SSL连接通讯..
String keyFile = clientkey.jks
String keyFilePass = "111111"
System.setProperty("javax.net.ssl.trustStore",keyFile);
System.setProperty("javax.net.ssl.trustStorePassword",keyFilePass);
以上..实现了密钥对的创建及管理之后..我们就可以开始实现SSL通讯了..
1.使用keytool创建密钥对..并在服务端和客户端完成分配..具体方法可参看:java-使用keytool来创建管理密钥及证书
2.建立客户端和服务端的socket实例:
客户端代码如下:
public class SSLClient {
public static void startSSLClient() throws IOException {
int port = 15408;//要连接的服务器端口
String serverAdd = "127.0.0.1";//要连接的服务器地址
try {
System.setProperty("javax.net.ssl.trustStore","clientkey.jks");//设置可信任的密钥仓库
System.setProperty("javax.net.ssl.trustStorePassword","sslkey1"); //设置可信任的密钥仓库的密码
SSLSocketFactory sslsf = (SSLSocketFactory)SSLSocketFactory.getDefault();//利用工厂来创建SSLSocket安全套接字
Socket csocket = sslsf.createSocket(serverAdd,port);//创建并连接服务器
System.out.println("Client OK~");
System.out.println("===============");
System.out.println("");
//以下代码同socket通讯实例中的代码
BufferedReader socketIn = new BufferedReader( new InputStreamReader(csocket.getInputStream()));//接受到的信息
PrintStream socketOut = new PrintStream(csocket.getOutputStream());//要发送的信息
BufferedReader userIn = new BufferedReader( new InputStreamReader(System.in));//用户输入信息
String s;
while ( true ) {
System.out.print("Client Message: ");
s = userIn.readLine();
socketOut.println(s);
if ( s.trim().equals("BYE") ) break;
else {
System.out.println("Please wait Server Message..");
System.out.println("");
}
s = socketIn.readLine();
System.out.println("Server Message: " + s);
if ( s.trim().equals("BYE") ) break;
}
socketIn.close();
socketOut.close();
userIn.close();
csocket.close();
}
catch (Exception e) {
System.out.println("Error: " + e);
}
}
public static void main(String[] args) {
try {
startSSLClient();
}
catch (Exception e) {
System.out.println("Error: " + e);
}
}
}
服务端代码如下:(这里像换种方式写..结果写烦了..呵呵)
public class SSLServer {
public static void startSSLServer() throws IOException {
int port = 15408;//监听端口
String keyFile = "serverkey.jks";//密钥库文件
String keyFilePass = "sslkey1";//密钥库的密码
String keyPass = "sslkey1";//密钥别名的密码
SSLServerSocket sslsocket = null;//安全连接套接字
KeyStore ks;//密钥库
KeyManagerFactory kmf;//密钥管理工厂
SSLContext sslc = null;//安全连接方式
//初始化安全连接的密钥
try {
ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream(keyFile), keyFilePass.toCharArray());
kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks,keyPass.toCharArray());
sslc = SSLContext.getInstance("SSLv3");
sslc.init(kmf.getKeyManagers(), null, null);
} catch (KeyManagementException ex) {
Logger.getLogger(SSLServer.class.getName()).log(Level.SEVERE, null, ex);
} catch (UnrecoverableKeyException ex) {
Logger.getLogger(SSLServer.class.getName()).log(Level.SEVERE, null, ex);
} catch (KeyStoreException ex) {
Logger.getLogger(SSLServer.class.getName()).log(Level.SEVERE, null, ex);
} catch (NoSuchAlgorithmException ex) {
Logger.getLogger(SSLServer.class.getName()).log(Level.SEVERE, null, ex);
} catch (CertificateException ex) {
Logger.getLogger(SSLServer.class.getName()).log(Level.SEVERE, null, ex);
}
//用安全连接的工厂来创建安全连接套接字
SSLServerSocketFactory sslssf = sslc.getServerSocketFactory();
sslsocket = (SSLServerSocket) sslssf.createServerSocket(port);//创建并进入监听
System.out.println("Listening...");
SSLSocket ssocket = (SSLSocket)sslsocket.accept();//接受客户端的连接
System.out.println("Server Connection OK~");
System.out.println("========================");
System.out.println("");
//以下代码同socket通讯实例中的代码
BufferedReader socketIn = new BufferedReader(new InputStreamReader(ssocket.getInputStream()));
BufferedReader userIn = new BufferedReader(new InputStreamReader(System.in));
PrintStream socketOut = new PrintStream(ssocket.getOutputStream());
String s;
while (true) {
System.out.println("Please wait client 's message..");
System.out.println("");
s = socketIn.readLine();
System.out.println("Client Message: " + s);
if ( s.trim().equals("BYE") ) break;
System.out.print("Server Message: ");
s = userIn.readLine();
socketOut.println(s);
if ( s.trim().equals("BYE") ) break;
}
socketIn.close();
socketOut.close();
userIn.close();
sslsocket.close();
}
public static void main(String [] args) {
try {
startSSLServer();
}
catch (Exception e) {
System.out.println("Error: " + e);
}
}
}
以上..基本实现了SSL连接..用wireshark抓包比较..证明此方法确实经过加密..比较安全..
android反编译,android的apk反编译工具,适合大家一起学,可以把android生成的apk转为java代码,希望对大家有用。
一、更改apk文件的后缀名,如:LianyunHelper3.0.11.apk改成LianyunHelper3.0.11.zip
二、用zip解压缩LianyunHelper3.0.11.zip文件
三、从解压缩的文件夹中取出classes.dex文件并放到dex2jar.bat所在目录
四、运行cmd命令,进入dex2jar.bat所在的目录,输入dex2jar.bat classes.dex即可生成classes.dex.dex2jar.jar文件
五、用jd-gui工具打开classes.dex.dex2jar.jar文件,即可看到源码
六、将AndroidManifest.xml文件放到AXMLPrinter2.jar所在目录,运行cmd命令,进入 AXMLPrinter2.jar所在目录,输入java -jar AXMLPrinter2.jar AndroidManifest.xml > AndroidManifest.txt。