20155228 2016-2017-2 《Java程序设计》第10周学习总结
教材学习内容总结
网络
网络是能够波此通信的计算机的集合根据范}到的宽度,网络可以分为局域网和广域网。LAN通常限定在一个有效的地理区域之内,例如建筑之内,最少由3台计算机,最多由数百台计算机组成。而WAN相反,由地理上分隔开的多个LAN组成。当然,最大的网络还是互联网。
HTTP是允许Web服务器和浏览器之间通过互联网发送和接收数据的协议。它是一种请求和响应协议。客户端请求一个文件,而服务器则响应该请求。HTTP使用可靠的TCP连接,默认是80号端上的TCP。HTTP的第一个版本是HTTP/0.9,随后就被HTTP/ 1.0所替代。替代HTTP/1.0的当前的版本是HTTP/1.1,该版本在RFC 2616中定义,可以从http://www.w3.org/Protocols/HTTP, 1. 1 /rtc2616.pdf 中下载该文档。
URL是互联网资源的唯一的地址。例如,互联网上的每一页都有一个不同的URL。URL有几个部分。第1部分表示用来获取资源的协议。在上面的例子中,协议是HTTP。第2部分www.yahoo.com是主机。它告诉你资源驻留在什么位置。主机后面的数字80是一个端口号。最后一部分/enlindex.html,指定了到URL的路径。默认情况下,HTTP使用端口80。
URLConnection表示到远程机器的一次连接。使用它读取资源并写到一台远程机器中。URLConnection类并没有公共的构造方法,因此,你无法使用new关键字来构造一个URLConnection实例。要获取URLConnection的一个实例,可以在个URL对象上调川openConnection方法。URLConnection类有两个布尔类型的字段,dolnput和do0utput,它们分别表示:URLConnection是用于读还是写。dolnput的默认值是true,表示可以使用一个URLConnection来读取一个Web资源。do0utput的默认值是false,表示一个URLConnection不能用于写。可以使用setDofnput和setDoOutput方法来设置dolnput和do0utput的值。
套接字是一个网络连接的端点。套接字使得应用程序能够从网络读取或者向网络写入信息。位于两台不同的计算机上的软件,通过一个连接来发送和接受位数据流,就可以彼此通信。要从你的应用程序向另一个应用程序发送一条消息,需要知道另一个应用程序的IP地址以及套接字的端口号。在Java中,使用一个」ava.net.Socket对象来表示一个套接字。
Socket表示一个客户端套接字,即当你想要连接到一个远程服务器应用的时候,可以构造一个套接字。然而,如果你想要实现一个服务器应用程序,例如个HTTP服务器或一个FTP服务器,你需要一种不同的方法。服务器必须随时待命,因为它不知道客户端应用程序下什么时候会尝试连接它。为了让应用程序能够做到这一点,你需要使用java.net.ServerSocket类。ServerSocket是服务器套接字的一个实现。
java密码技术
密码学常用术语 | 常用术语解释 |
---|---|
明文(Plaintext) | 指待加密信息。明文可以是文本文件、 图片文件、 二进制数据等。 |
密文(Ciphertext) | 指经过加密后的明文。 密文通常以文本、 二进制数据等形式存在。 |
发送者(Sender) | 指发送消息的人。 |
接收者(Receiver) | 指接收消息的人。 |
加密(Encryption) | 指将明文转换为密文的过程。 |
加密算法( Encryption Algorithm) | 指将明文转换为密文的算法。 |
加密密钥( Encryption Key) | 指通过加密算法进行加密操作用的密钥。 |
解密( Decryption) | 指将密文转换成明文的过程。 |
解密算法( Decryption Algorithm) | 指将密文转换为明文的算法。 |
解密密钥( Decryption Key) | 指通过解密算法进行解密操作用的密钥。 |
密码分析( Cryptanalysis) | 指截获密文者试图通过分析截获的密文从而推断出原来的明文或密钥的过程。 |
密码分析者( Cryptanalyst) | 等同于密码破译者, 指从事密码分析的人。 |
被动攻击( Passive Attack) | 指对一个保密系统采取截获密文并对密文进行分析和攻击的行为。 这种攻击对密文没有破坏作用。 |
主动攻击( Active Attack) | 指攻击者非法入侵密码系统, 采用伪造、 修改、 删除等手段向系统注入假消息进行欺骗的行为。 这种攻击对密文具有破坏作用。 |
密码体制( Cipher System) | 由明文空间、 密文空间、 密钥空间、 加密算法和解密算法五部分构成。 |
Java安全体系结构总共分为4个部分:
JCA( Java Cryptography Architecture, Java加密体系结构):JCA提供基本的加密框架, 如证书、 数字签名、消息摘要和密钥对产生器。
JCE( Java Cryptography Extension, Java加密扩展包):JCE在JCA的基础上作了扩展, 提供了各种加密算法、 消息摘要算法和密钥管理等功能。JCE的实现主要在javax.crypto包( 及其子包) 中
JSSE( Java Secure Sockets Extension, Java安全套接字扩展包):JSSE提供了基于SSL( Secure Sockets Layer,安全套接字层) 的加密功能。 在网络的传输过程中, 信息会经过多个主机(很有可能其中一台就被窃听) , 最终传送给接收者, 这是不安全的。这种确保网络通信安全的服务就是由JSSE来提供的。
JAAS( Java Authentication and Authentication Service, Java鉴别与安全服务):JAAS提供了在Java平台上进行用户身份鉴别的功能。
教材学习中的问题和解决过程
1.java中的网络通信的方式和区别
名称 | 解释 |
---|---|
TCP | TCP是一种面向连接的保证可靠传输的协议。通过TCP实现的传输,得到的是一个顺序的无差错的数据流。发送方和接收方成对的两个socket之间必须建立连接,以便在TCP的基础上进行通信,当一server socket)等个socket(通常都是等待建立连接时 |
UDP | 而UDP是一种无连接的协议,每个数据都是一个独立的信息,包括完整的源地址和目的地址 ,UDP是不可靠的。 |
2.JAVA使用DES对称加密
DES是一种对称加密(Data Encryption Standard)算法,一般有两个关键点:第一个是加密算法,第二个是数据补位。
DES加密算法常见的有ECB模式和CBC模式:
- ECB模式:电子密本方式,这是JAVA封装的DES算法的默认模式,就是将数据按照8个字节一段进行DES加密或解密得到一段8个字节的密文或者明文,最后一段不足8个字节,则补足8个字节(注意:这里就涉及到数据补位了)进行计算,之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。
- CBC模式:密文分组链接方式,这是.NET封装的DES算法的默认模式,比较麻烦。
数据补位
一般有NoPadding和PKCS7Padding填充方式,PKCS7Padding和PKCS5Padding只是协议不一样,,PKCS5Padding明确定义了加密块是8字节,PKCS7Padding加密快可以是1-255之间。但是封装的DES算法默认都是8字节,所以可以认为他们一样。
对于JAVA在使用DES对称加密时,需要指定算法和填充模式,并且在写DES加解密算法时,还需要根据创建Cipher对象的不同,正确使用IV向量。在不同系统需要互相数据时,必须要明确的是加密算法,Key和算法模式,再根据不同模式是否需要IV向量,最后是填充模式。
代码调试中的问题和解决过程
JAVA中的DES加密
public static String encrypt2(String src) throws Exception {
SecureRandom sr = new SecureRandom();
DESKeySpec ks = new DESKeySpec(KEY.getBytes("UTF-8"));
SecretKeyFactory skf = SecretKeyFactory.getInstance("DES");
SecretKey sk = skf.generateSecret(ks);
Cipher cip = Cipher.getInstance("DES/CBC/PKCS5Padding");//Cipher.getInstance("DES");
IvParameterSpec iv2 = new IvParameterSpec(IV);
cip.init(Cipher.ENCRYPT_MODE, sk, iv2);//IV的方式
//cip.init(Cipher.ENCRYPT_MODE, sk, sr);//没有传递IV
String dest = byteToHex(cip.doFinal(src.getBytes("UTF-8")));
return dest;
}
JAVA的javax.crypto.Cipher包下,提供了加密解密的功能,它的静态
getInstance
方法,可以返回一个Cipher
对象,一般有public static final Cipher getInstance(String transformation)
方法,transformation
为:algorithm/mode/padding
,分别表示算法名称,比如DES,也可以在后面包含算法模式和填充方式,但也可以只是算法名称。JAVA中默认的算法为ECB
,默认填充方式为PKCS5Padding
。
Cipher的Init方法用来初始化加密对象,常见的有:public final void init(int opmode, Key key, AlgorithmParameterSpec params)
public final void init(int opmode,Key key, SecureRandom random)
代码托管
上周考试错题总结
1.ByteBuffer 调用了flip()之后,position的值一定是0。
A .True
B .False
答案:B
2.正则表达式”(‘|”)(.*?)\1”匹配 “'Hello',"World””的结果是()
A .不匹配
B .'Hello'
C ."World"
D .'Hello',"World"
答案:B、C
解析:反向引用 \1 代表第一个()中的匹配内容
3.bc? 匹配( )
A .ab
B .abc
C .abcc
D .abccc
答案:A、B
解析:? 重复0或1次
4.Which of the statements is true about the following code snippet?(对于下面的代码段,说法正确的是?)
int[] array = new int[25];
array[25] = 2;
A .The integer value 2 will be assigned to the last index in the array.(整数2会赋给数组中最后一个元素)
B .The integer value 25 will be assigned to the second index in the array.(整数25会赋给数组中的第2个索引)
C .The integer value 25 will be assigned to the third value in the array. (整数25会赋给数组中的第3个元素)
D .This code will result in a compile-time error.(代码会产生编译时错误)
E .This code will result in a run-time error. (代码会产生运行时错误)
答案:E
解析:This code will throw an ArrayIndexOutOfBoundsException, since the last index in this array will be 24. This causes a run-time error.
结对及互评
评分标准
- 正确使用Markdown语法(加1分):
- 不使用Markdown不加分
- 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
- 排版混乱的不加分
- 模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
教材学习中的问题和解决过程, 一个问题加1分
代码调试中的问题和解决过程, 一个问题加1分
- 本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
- 其他加分:
- 周五前发博客的加1分
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
- 扣分:
- 有抄袭的扣至0分
- 代码作弊的扣至0分
- 迟交作业的扣至0分
点评过的同学博客和代码
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 20篇 | 400小时 | |
第一周 | 10/10 | 1/4 | 12/12 | |
第二周 | 120/130 | 1/5 | 9/21 | |
第三周 | 210/340 | 1/6 | 9/30 | |
第四周 | 460/800 | 1/7 | 9/39 | |
第五周 | 400/1200 | 1/8 | 9/48 | |
第六周 | 300/1500 | 1/9 | 9/57 | |
第七周 | 300/1800 | 2/11 | 9/66 | |
第八周 | 300/2100 | 1/12 | 9/75 | |
第九周 | 300/2400 | 2/14 | 9/84 | |
第十周 | 300/2700 | 1/15 | 9/93 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
计划学习时间:9小时
实际学习时间:9小时
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)