javascript + MD5实现安全登录
登录页面login.jsp
<%@ page language="java" pageEncoding="GBK"%><%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %><%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %><%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %><html><head> <title>登录</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><link rel="stylesheet" type="text/css" href="keyboard.css"><script type="text/javascript" src="keyboard.js" charset="UTF-8"></script><script type="text/javascript" src="prototype.js" charset="UTF-8"></script><script type="text/javascript" src="MD5.js" charset="UTF-8"></script><script type="text/javascript">function hash(){var challenge = $("challenge").value; var hash1 = $("password").value; var hash2 = MD5($("password").value) + challenge;alert(hash2);var hash; if($("password").value){ hash=MD5(hash2); } else { hash=""; } var url = $("login").action;url += (url.indexOf('?')==-1)?"?":"&"; url += "userName="+$("userName").value+"&password="+hash+"&rr="+Math.random(); $("login").action = url; $("login").submit();}</script></head> <body> <html:form action="/login" method="post" focus="userName" styleId="login" > <table border="0"> <tr> <td>Login:</td> <td><html:text property="userName" styleId="userName"/></td> </tr> <tr> <td>Password:</td> <td><html:password property="password" styleClass="keyboardInput" styleId="password"/></td> </tr> <tr> <html:hidden property="challenge" value="${challenge}" styleId="challenge"/> <td colspan="2" align="center"><html:submit /></td> </tr> </table> </html:form></body></html>
MD5.js 源文件
/* * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message * Digest Algorithm, as defined in RFC 1321. * Copyright (C) Paul Johnston 1999 - 2000. * Updated by Greg Holt 2000 - 2001. * See http://pajhome.org.uk/site/legal.html for details. */var hex_chr = "0123456789abcdef";function rhex(num) {str = "";for (j = 0; j <= 3; j++) {str += hex_chr.charAt((num >> (j * 8 + 4)) & 15) + hex_chr.charAt((num >> (j * 8)) & 15);}return str;}function str2blks_MD5(str) {nblk = ((str.length + 8) >> 6) + 1;blks = new Array(nblk * 16);for (i = 0; i < nblk * 16; i++) {blks = 0;}for (i = 0; i < str.length; i++) {blks |= str.charCodeAt(i) << ((i % 4) * 8);}blks |= 128 << ((i % 4) * 8);blks = str.length * 8;return blks;}function add(x, y) {var lsw = (x & 65535) + (y & 65535);var msw = (x >> 16) + (y >> 16) + (lsw >> 16);return (msw << 16) | (lsw & 65535);}function rol(num, cnt) {return (num << cnt) | (num >>> (32 - cnt));}function cmn(q, a, b, x, s, t) {return add(rol(add(add(a, q), add(x, t)), s), b);}function ff(a, b, c, d, x, s, t) {return cmn((b & c) | ((~b) & d), a, b, x, s, t);}function gg(a, b, c, d, x, s, t) {return cmn((b & d) | (c & (~d)), a, b, x, s, t);}function hh(a, b, c, d, x, s, t) {return cmn(b ^ c ^ d, a, b, x, s, t);}function ii(a, b, c, d, x, s, t) {return cmn(c ^ (b | (~d)), a, b, x, s, t);}function MD5(str) {x = str2blks_MD5(str);var a = 1732584193;var b = -271733879;var c = -1732584194;var d = 271733878;for (i = 0; i < x.length; i += 16) {var olda = a;var oldb = b;var oldc = c;var oldd = d;a = ff(a, b, c, d, x, 7, -680876936);d = ff(d, a, b, c, x, 12, -389564586);c = ff(c, d, a, b, x, 17, 606105819);b = ff(b, c, d, a, x, 22, -1044525330);a = ff(a, b, c, d, x, 7, -176418897);d = ff(d, a, b, c, x, 12, 1200080426);c = ff(c, d, a, b, x, 17, -1473231341);b = ff(b, c, d, a, x, 22, -45705983);a = ff(a, b, c, d, x, 7, 1770035416);d = ff(d, a, b, c, x, 12, -1958414417);c = ff(c, d, a, b, x, 17, -42063);b = ff(b, c, d, a, x, 22, -1990404162);a = ff(a, b, c, d, x, 7, 1804603682);d = ff(d, a, b, c, x, 12, -40341101);c = ff(c, d, a, b, x, 17, -1502002290);b = ff(b, c, d, a, x, 22, 1236535329);a = gg(a, b, c, d, x, 5, -165796510);d = gg(d, a, b, c, x, 9, -1069501632);c = gg(c, d, a, b, x, 14, 643717713);b = gg(b, c, d, a, x, 20, -373897302);a = gg(a, b, c, d, x, 5, -701558691);d = gg(d, a, b, c, x, 9, 38016083);c = gg(c, d, a, b, x, 14, -660478335);b = gg(b, c, d, a, x, 20, -405537848);a = gg(a, b, c, d, x, 5, 568446438);d = gg(d, a, b, c, x, 9, -1019803690);c = gg(c, d, a, b, x, 14, -187363961);b = gg(b, c, d, a, x, 20, 1163531501);a = gg(a, b, c, d, x, 5, -1444681467);d = gg(d, a, b, c, x, 9, -51403784);c = gg(c, d, a, b, x, 14, 1735328473);b = gg(b, c, d, a, x, 20, -1926607734);a = hh(a, b, c, d, x, 4, -378558);d = hh(d, a, b, c, x, 11, -2022574463);c = hh(c, d, a, b, x, 16, 1839030562);b = hh(b, c, d, a, x, 23, -35309556);a = hh(a, b, c, d, x, 4, -1530992060);d = hh(d, a, b, c, x, 11, 1272893353);c = hh(c, d, a, b, x, 16, -155497632);b = hh(b, c, d, a, x, 23, -1094730640);a = hh(a, b, c, d, x, 4, 681279174);d = hh(d, a, b, c, x, 11, -358537222);c = hh(c, d, a, b, x, 16, -722521979);b = hh(b, c, d, a, x, 23, 76029189);a = hh(a, b, c, d, x, 4, -640364487);d = hh(d, a, b, c, x, 11, -421815835);c = hh(c, d, a, b, x, 16, 530742520);b = hh(b, c, d, a, x, 23, -995338651);a = ii(a, b, c, d, x, 6, -198630844);d = ii(d, a, b, c, x, 10, 1126891415);c = ii(c, d, a, b, x, 15, -1416354905);b = ii(b, c, d, a, x, 21, -57434055);a = ii(a, b, c, d, x, 6, 1700485571);d = ii(d, a, b, c, x, 10, -1894986606);c = ii(c, d, a, b, x, 15, -1051523);b = ii(b, c, d, a, x, 21, -2054922799);a = ii(a, b, c, d, x, 6, 1873313359);d = ii(d, a, b, c, x, 10, -30611744);c = ii(c, d, a, b, x, 15, -1560198380);b = ii(b, c, d, a, x, 21, 1309151649);a = ii(a, b, c, d, x, 6, -145523070);d = ii(d, a, b, c, x, 10, -1120210379);c = ii(c, d, a, b, x, 15, 718787259);b = ii(b, c, d, a, x, 21, -343485551);a = add(a, olda);b = add(b, oldb);c = add(c, oldc);d = add(d, oldd);}return rhex(a) + rhex(b) + rhex(c) + rhex(d);}
在进入登录页面前,先生成challenge,这是一个随机数。
/* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */package com.sunsoft.loginDemo.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;/*** MyEclipse Struts * Creation date: 06-03-2008 ** XDoclet definition: * @struts.action validate="true" */public class IndexAction extends Action {/* * Generated Methods *//*** Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {RandString rs = new RandString(30);String msg = rs.next().toString();request.getSession().setAttribute("challenge", msg);return mapping.findForward("login");}} 生成随机数的类:RandString.java
package com.sunsoft.loginDemo.action;import java.util.Random;public class RandString { private int len; private NextRandChar nc = new NextRandChar(); public RandString(int length) { len = length; } public Object next() { char[] buf = new char; for(int i = 0; i < len; i++) buf = nc.next(); return new String(buf); }}class NextRandChar {private static String chars= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";private static char[] src = chars.toCharArray();Random r = new Random(); public char next() { return src; }}
验证密码:
/* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */package com.sunsoft.loginDemo.action;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.struts.action.Action;import org.apache.struts.action.ActionForm;import org.apache.struts.action.ActionForward;import org.apache.struts.action.ActionMapping;import com.sunsoft.loginDemo.form.LoginForm;/*** MyEclipse Struts * Creation date: 06-02-2008 ** XDoclet definition: * @struts.action path="/login" name="loginForm" input="/login.jsp" scope="request" validate="true" */public class LoginAction extends Action {/* * Generated Methods *//*** Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */public ActionForward execute(ActionMapping mapping, ActionForm form,HttpServletRequest request, HttpServletResponse response) {LoginForm loginForm = (LoginForm) form;if(loginForm.getUserName().equals("sunxboy")){String password = loginForm.getPassword();String challenge = (String) request.getSession().getAttribute("challenge");String md5_challenge = MD5.getInstance().getMD5ofStr("sunxboy").toLowerCase()+challenge;String sign = MD5.getInstance().getMD5ofStr(md5_challenge);if(sign.toLowerCase().equals(password)){return mapping.findForward("success");}}return mapping.findForward("error");}}
此方法有个缺陷,必须将数据库的密码取出,加密后与回传的加密过的密码比较。
对于需将密码还原成明文后,传入数据库进行验证的情况,则另论。
页:
[1]