代码安全性
我编写的这个登录来解释安全性。
这个的验证码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
package LOGINCODE; import java.awt.Color; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ServletDemo4 */ @WebServlet( "/ServletDemo4" ) public class ServletDemo4 extends HttpServlet { private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { //这个方法实现验证码的生成 BufferedImage bi = new BufferedImage(68, 22, BufferedImage.TYPE_INT_RGB); //创建图像缓冲区 Graphics g = bi.getGraphics(); //通过缓冲区创建一个画布 Color c = new Color(255, 255, 255); //创建颜色 /*根据背景画了一个矩形框 */ g.setColor(c); //为画布创建背景颜色 g.fillRect(0, 0, 68, 22); //fillRect:填充指定的矩形 // X和Y用于指定矩形左上角也就是相对于原点的位置,width和height用于指定矩形的宽和高。 char [] ch = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" .toCharArray(); //转化为字符型的数组 Random r = new Random(); int len = ch.length; int index; //index用于存放随机数字 StringBuilder sb = new StringBuilder(); for ( int i = 0; i < 4; i++) { index = r.nextInt(len); //产生随机数字 g.setColor( new Color(r.nextInt(88), r.nextInt(188), r.nextInt(255))); //设置颜色随机 g.drawString(ch[index] + "" , (i * 15) + 3, 18); //画数字以及数字的位置 sb.append(ch[index]); } request.getSession().setAttribute( "piccode" , sb.toString()); //将数字保留在session中,便于后续的使用 ImageIO.write(bi, "JPG" , response.getOutputStream()); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
package LOGINCODE; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * Servlet implementation class ServletDemo5 */ @WebServlet( "/ServletDemo5" ) public class ServletDemo5 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException //用于验证验证码 { String piccode = (String) request.getSession().getAttribute( "piccode" ); String checkCode = request.getParameter( "checkCode" ); //取值 //checkCode=checkCode.toUpperCase(); //把字符全部转换为大写的(此语句可以用于验证码不区分大小写) response.setContentType( "text/html;charset=gbk" ); //解决乱码问题 PrintWriter out = response.getWriter(); Map<String,String> map= new HashMap<>(); String html = "<html><head><title></title></head><body><p>登录成功</p><a href='File5.jsp'>返回</a></body></html>" ; //设置登录成功页面 if (checkCode. equals (piccode)) { request.getRequestDispatcher( "File5.jsp" ).forward(request,response); } else { out .println( "验证码输入错误!!!" ); } out .flush(); //将流刷新 out .close(); //将流关闭 } } |
验证码的目的:防止恶意破解密码、刷票、论坛灌水、刷页。 有效防止某个黑客对某一个特定注册用户用特定程序暴力破解方式进行不断的登录尝试,实际上使用验证码是现在很多网站通行的方式(比如招商银行的网上个人银行,百度社区),我们利用比较简易的方式实现了这个功能。虽然登录麻烦一点,但是对网友的密码安全来说这个功能还是很有必要,也很重要。但我们还是 提醒大家要保护好自己的密码 ,尽量使用混杂了数字、字母、符号在内的6位以上密码,不要使用诸如1234之类的简单密码或者与用户名相同、类似的密码 ,免得你的账号被人盗用给自己带来不必要的麻烦。 验证码通常使用一些线条和一些不规则的字符组成,主要作用是为了防止一些黑客把密码数据化盗取。
体现的安全性。
这个注册界面:账号密码均为xg123,然后利用MD5将密码加密,注册数据库中密码为:
主要代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
package code; import java.security.MessageDigest; public class Securitycode { public static String MD5(String s) { try { MessageDigest md = MessageDigest.getInstance( "MD5" ); byte [] bytes = md.digest(s.getBytes( "utf-8" )); return toHex(bytes); } catch (Exception e) { throw new RuntimeException(e); } } public static String toHex( byte [] bytes) { final char [] HEX_DIGITS = "0123456789ABCDEF" .toCharArray(); StringBuilder ret = new StringBuilder(bytes.length * 2); for ( int i = 0; i < bytes.length; i++) { ret.append(HEX_DIGITS[(bytes[i] >> 4) & 0x0f]); ret.append(HEX_DIGITS[bytes[i] & 0x0f]); } return ret.toString(); } } |
这样是保护了用户账户的安全性,防止密码中途被窃取。