Android网络编程系列 一 JavaSecurity之JSSE(SSL/TLS)

Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身份认证可选)、密钥交换;
ChangeCipherSpec 协议:一条消息表明握手协议已经完成;
Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,fatal类型的错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,只是会给出错误警告;
Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等。


ServerSayHiDone:服务器发送这条消息表明服务器部分的密钥交换信息已经发送完了,等待客户端的消息以继续接下来的步骤。这条消息只用作提醒,不包含数据域。
Finished:表明握手阶段结束。这是第一条用协商的算法和密钥保护的消息。因为是用协商好的密钥加密的消息,它可以用来确认已经协商好的密钥。同时Finished消息包含一个verify_data域,可以用来校验之前发送和接收的信息。 Verify_data域是一个PRF函数的输出(pseudo-random function)。这个伪随机函数的输入为:(1)两个hash值:一个SHA-1,一个MD5,对之前握手过程中交换的所有消息做加密哈希功能(消息摘要),在这里server就可以根据数据的哈希值和MD5值进行验证传输数据的完整性;(2)the MasterSecret,由预备主密钥生成。
Key:属于JCE的范畴,可分为对称key和非对称key。对称key就是接下来的通信双方用来加密数据的秘钥,非对称key就是公钥和私钥了。其内部表示形式就是一个类,其外部表示形式就 是一个比特(bit)字符串,key就是用来参与加密解密数据的,就像是一把开锁的钥匙。
对称加密(symmetric cryptography):就是须要两边应用一样的 key 来加密解密消息算法,常用密钥算法有 Data Encryption Standard(DES)、triple-strength DES(3DES)、Rivest Cipher 2 (RC2)和 Rivest Cipher 4(RC4)。因为对称算法效力相对较高,是以 SSL 会话中的敏感数据都用经由过程密钥算法加密。
非对称加密(asymmetric cryptography):就是 key 的构成是公钥私钥对 (key-pair),公钥传递给对方私钥本身保存。公钥私钥算法是互逆的,一个用来加密,另一个可以解密。常用的算法有 Rivest Shamir Adleman(RSA)、Diffie-Hellman(DH)。非对称算法策画量大斗劲慢,是以仅实用于少量数据加密,如对密钥加密,而不合适多量数据的通信加密。
加密哈希功能(Cryptographic Hash Functions): 加密哈希功能与 checksum 功能相类似。区别在于,checksum 用来侦测不测的数据变更而前者用来侦测有心的数据批改。数据被哈希后产生一小串比特字符串,渺小的数据改变将导致哈希串的变更。发送加密数据时,SSL 会应用加密哈希功能来确保数据一致性,用来阻拦第三方破损通信数据完全性。SSL 常用的哈希算法有 Message Digest 5(MD5)和 Secure Hash Algorithm(SHA)。
消息认证码(Message Authentication Code): 消息认证码与加密哈希功能相类似,在哈希加密机基础上它须要将密钥信息与加密哈希功能产生的数据连络就是哈希消息认证码(HMAC)。若是 A 要确保给 B 发的消息不被 C 批改,他要按如下步调做 --A 起首要生成一个 HMAC值;,将其添加到原始消息后面。用 A 与 B 之间通信的密钥加密消息体,然后发送给 B。B 收到消息后用密钥解密,然后就通信数据重新创建一个 HMAC值,将前后两个值进行对比来断定消息是否在传输中被批改。
数字(Digital Signature):一个消息的加密哈希被创建后,哈希值用发送者的私钥加密,加密的成果就是叫做数字。

void initServer(){
try {
//获取ssl协议的安全环境,或者TLS
SSLContext sContext = SSLContext. getInstance("SSL");
//获取jks算法格式的秘钥存储器-常见的有JKS, JCEKS,and PKCS12。其中功能比较全的是JCEKS
KeyStore store = KeyStore. getInstance("JKS");
AssetManager manager = mContext.getAssets();
InputStream is = manager.open( "test_key_store");
//将证书导入到秘钥存储器中,同时给其配置一个打开密码。有时候我们需要有不同类型的秘钥需要多个秘钥存储器来存储
store.load( is, "kevin".toCharArray());
is.close();
//为了管理多个或多种秘钥存储器,这里引入了一秘钥管理器这个概念,就是专门管理多个或多种秘钥存储器
KeyManagerFactory factory = KeyManagerFactory.getInstance(KeyManagerFactory. getDefaultAlgorithm());
//给每个秘钥管理器的安置的秘钥存储器配置一个获取密码
factory.init( store, "123456".toCharArray());
/**
* 初始化 ssl协议安全环境。 init函数有三个参数,第一个是KeyManager数组,server端需要用它里面的保存的私钥来签名证书
* 第二个是TrustManager数组,第三个是SecureRandom,用来创建随机数的
* 对于server端而言,它不需要验证客户端证书,所以很显然第一个参数用来创建服务端Socket的,而第二个参数用于创建客户端Socket(也可以都不填)
*/
sContext.init( factory.getKeyManagers(), null, null );
//以下就是配置 ip和端口来链接
InetAddress address = Inet4Address. getLocalHost();
SSLServerSocket serverSocket = (SSLServerSocket) sContext.getServerSocketFactory().createServerSocket(8666,1,address);
Socket socket = serverSocket.accept();
InputStream in = socket.getInputStream();
byte[] data = new byte[1024];
int count = in .read(data );
Log. i("TAG", "DATA:"+new String(data , 0, count ));
in.close();
socket.close();
serverSocket.close();
} catch (NoSuchAlgorithmException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyStoreException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CertificateException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnrecoverableKeyException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyManagementException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}


void initClient(){
try {
//获取ssl协议的安全环境
SSLContext sContext = SSLContext. getInstance("SSL");
//获取BKS算法格式的秘钥存储器-Android中通用的格式
KeyStore store = KeyStore. getInstance("BKS");
AssetManager manager = mContext.getAssets();
//这里是使用Java自带的工具 keytool创建的一个证书放在工程assert文件中
InputStream is = manager.open( "test_key_store");
//将证书导入到秘钥存储器中,同时给其配置一个打开密码。有时候我们需要有不同类型的秘钥需要多个秘钥存储器来存储
store.load( is, "kevin".toCharArray());
is.close();
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory. getDefaultAlgorithm());
//初始化trustManagerFactory也就是将证书内容导入进去
trustManagerFactory.init(store );
/**
* 初始化 ssl协议安全环境。 init函数有三个参数,第一个是KeyManager数组,
* 第二个是TrustManager数组,第三个是SecureRandom,用来创建随机数的
* 对于client端而言,它需要验证服务端证书,所以只需要可以去而第二个参数(也可以都不填)
*/
sContext.init( null, trustManagerFactory .getTrustManagers(), null);
//以下就是配置 ip和端口来链接
InetAddress address = Inet4Address. getLocalHost();
SSLSocket socket = (SSLSocket) sContext.getSocketFactory().createSocket(address ,8666);
OutputStream out = socket.getOutputStream();
String data = "hello i'm spencer but you can call me kevin" ;
out.write( data.getBytes());
out.close();
socket.close();
} catch (NoSuchAlgorithmException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyStoreException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CertificateException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyManagementException e ) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

Android网络编程系列 一 JavaSecurity之JSSE(SSL/TLS)的更多相关文章
- Android网络编程系列 一 TCP/IP协议族
在学习和使用Android网路编程时,我们接触的仅仅是上层协议和接口如Apache的httpclient或者Android自带的httpURlconnection等等.对于这些接口的底层实现我们也有必 ...
- Android网络编程系列 一 Socket抽象层
在<Android网络编程>系列文章中,前面已经将Java的通信底层大致的描述了,在我们了解了TCP/IP通信族架构及其原理,接下来我们就开始来了解基于tcp/ip协议层的Socket抽 ...
- Android网络编程系列 一 TCP/IP协议族之传输层
这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 传输层中有TCP协议与UDP协议. 1.UDP介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,U ...
- Android网络编程系列之Volley总结
前言 Volley的中文翻译为“齐射.并发”,是在2013年的Google大会上发布的一款Android平台网络通信库,具有网络请求的处理.小图片的异步加载和缓存等功能,能够帮助 Android AP ...
- Android网络编程系列 一 TCP/IP协议族之链路层
这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 数据链路层有三个目的: 为IP模块发送和 接收IP数据报. 为ARP模块发送ARP请求和接收ARP应答. 为RARP发送RA ...
- Android网络编程系列 一 TCP/IP协议族之网际层
这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 网际层包括:IP.ICMP.IGMP 以及处在网际层实际工作在链路层的 ARP 和 RARP等等协议. 1.IP协议 互联网 ...
- Android网络编程系列之HTTP协议原理总结
前言 作为搞移动开发的我们,免不了与网络交互打交道.虽然市面上很多开源库都封装的比较到位,我们实现网络访问也轻车熟路.但还是十分有必要简要了解一下其中的原理,以便做到得心应手,也是通往高级开发工程师甚 ...
- 猫哥网络编程系列:HTTP PEM 万能调试法
注:本文内容较长且细节较多,建议先收藏再阅读,原文将在 Github 上维护与更新. 在 HTTP 接口开发与调试过程中,我们经常遇到以下类似的问题: 为什么本地环境接口可以调用成功,但放到手机上就跑 ...
- Android网络编程(一)HTTP协议原理
相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection Android网络编程(三)Volley使用方法全解析 A ...
随机推荐
- C++智能指针管理类
1.程序员明确的进行内存释放 对于c++程序员,最头脑的莫过于对动态分配的内存进行管理了.c++在堆上分配的内存,需要程序员负责对分配的内存进行释放.但有时内存的释放看起来并不件很轻松的事,如下程序 ...
- 织梦cms PHPcms 帝国cms比较
现在建网站不需要请程序员从基础的程序开发做起了,有专业的建站工具,CMS是使用最广泛的建站工具.CMS是Content Management System 现在建网站不需要请程序员从基础的程序开发做起 ...
- maven之一——多模块项目构建
参考这个帖子: http://www.cnblogs.com/xdp-gacl/p/4242221.html
- log4j中文乱码解决方案
项目中log4j在英文版linux下输出中文日志为乱码. 由于log4j配置文件中没有设置编码格式(encoding),所以log4j就使用系统默认编码.导致乱码. 解决方法是设置编码格式UTF-8, ...
- zh-cn en-uk、zh-tw表示语言(文化)代码与国家地区对照表(最全的各国地区对照表)
af 公用荷兰语 af-ZA 公用荷兰语 - 南非 sq 阿尔巴尼亚 sq-AL 阿尔巴尼亚 -阿尔巴尼亚 ar 阿拉伯语 ar-DZ 阿拉伯语 -阿尔及利亚 ar-BH 阿拉伯语 -巴林 ar-EG ...
- Python3基础 使用技巧:多行同时缩进
镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...
- JavaWeb(一)
Web应用程序开发是目前软件开发领域的三大方向之一. 静态网页与动态网页 静态网页 表现形式:网页的内容是固定的,不会更新: 使用的技术:HTML,CSS 动态网页 表现形式:网页中的内容通过程序动态 ...
- 插入中文错误ERROR 1406 (22001): Data too long for column 'name' at row 1
1.在导入数据前执行以下命令即可:set SESSION sql_mode=''; 通过设置sql_mode变量更改模式.linux下安装完mysql后,默认的sql-mode值是空,在这种情形下my ...
- Java面试宝典2015版
这套面试题主要目的是帮助那些还没有java软件开发实际工作经验,而正在努力寻找java软件开发工作的朋友在笔试时更好地赢得笔试和面试.由于这套面试题涉及的范围很泛,很广,很杂,大家不可能一天两天就看完 ...
- C#窗体->>随机四则运算
用户需求: 程序能接收用户输入的整数答案,并判断对错程序结束时,统计出答对.答错的题目数量.补充说明:0——10的整数是随机生成的用户可以选择四则运算中的一种用户可以结束程序的运行,并显示统计结果.在 ...