信息发布软件,b2b软件,广告发布软件

 找回密码
 立即注册
搜索
查看: 1724|回复: 13
打印 上一主题 下一主题

[『JSP图文教程』] 用JSP如何实现自己的MD5给自己的东东加层密文

[复制链接]

1663

主题

1668

帖子

9619

积分

积分
9619
跳转到指定楼层
宣传软件楼主
发表于 2017-7-3 21:46:15 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

软件教程首图:

软件教程分类:JSP 图文教程 

软件图文教程视频教程分类:软件图文教程 

软件教程难易程度:软件初级教程 

软件教程发布日期:2017-07-03

软件教程关键字:用JSP如何实现自己的MD5给自己的东东加层密文

① 本信息收集于网络,如有不对的地方欢迎联系我纠正!
② 本信息免费收录,不存在价格的问题!
③ 如果您的网站也想这样出现在这里,请您加好友情链接,我当天会审核通过!

④友情链接关键字:软件定制网站 网址:http://www.postbbs.com

软件教程详细描述
本帖最后由 群发软件 于 2017-7-3 22:01 编辑

/**

建立一个名为MD5Digest的java文件,内容如下

/**
* 类名:      MD5Digest<br>
* 说明:   用来进行密码加密的md5公用参数<br>
* 编写日期:  2011/03/05<br>
* 修改者:    <br>
* 修改信息:  <br>
*/

在各种应用系统的开发中,经常需要存储用户信息,很多地方都要存储用户密码,而将用户密码直接存储在服务器上显然是不安全的,本文简要介绍在JSP中如何实现MD5加密的方法,希望能抛砖引玉。
(一)消息摘要简介
一个消息摘要就是一个数据块的数字指纹。即对一个任意长度的一个数据块进行计算,产生一个唯一指印(对于SHA1是产生一个20字节的二进制数组)。消息摘要是一种与消息认证码结合使用以确保消息完整性的技术。主要使用单向散列函数算法,可用于检验消息的完整性,和通过散列密码直接以文本形式保存等,目前广泛使用的算法有MD4、MD5、SHA-1。
消息摘要有两个基本属性:
两个不同的报文难以生成相同的摘要
难以对指定的摘要生成一个报文,而可以由该报文反推算出该指定的摘要。
Java源码
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5Digest { private MessageDigest __md5 = null; private StringBuffer __digestBuffer = null; public MD5Digest() throws NoSuchAlgorithmException { __md5 = MessageDigest.getInstance("MD5"); __digestBuffer = new StringBuffer(); } public String md5crypt(String s) { __digestBuffer.setLength(0); byte abyte0[] = __md5.digest(s.getBytes()); for(int i = 0; i < abyte0.length; i++) __digestBuffer.append(toHex(abyte0)); return __digestBuffer.toString(); } public String toHex(byte one){ String HEX="0123456789ABCDEF"; char[] result=new char[2]; result[0]=HEX.charAt((one & 0xf0) >> 4); result[1]=HEX.charAt(one & 0x0f); String mm=new String(result); return mm; } }
-------------------------------------------------------------------------------
/************************************************   MD5 算法的Java Bean   @author:Topcat Tuppin   Last Modified:10,Mar,2001   *************************************************/   package beartool;   import java.lang.reflect.*;   /*************************************************   md5 类实现了RSA Data Security, Inc.在提交给IETF   的RFC1321中的MD5 message-digest 算法。   *************************************************/   public class MD5 {   /* 下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define 实现的,   这里把它们实现成为static final是表示了只读,切能在同一个进程空间内的多个   Instance间共享*/   static final int S11 = 7;   static final int S12 = 12;   static final int S13 = 17;   static final int S14 = 22;   static final int S21 = 5;   static final int S22 = 9;   static final int S23 = 14;   static final int S24 = 20;   static final int S31 = 4;   static final int S32 = 11;   static final int S33 = 16;   static final int S34 = 23;   static final int S41 = 6;   static final int S42 = 10;   static final int S43 = 15;   static final int S44 = 21;   static final byte[] PADDING = { -128, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,   0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };   /* 下面的三个成员是MD5计算过程中用到的3个核心数据,在原始的C实现中   被定义到MD5_CTX结构中    */   private long[] state = new long[4];// state (ABCD)   private long[] count = new long[2];// number of bits, modulo 2^64 (lsb first)   private byte[] buffer = new byte[64]; // input buffer    /* digestHexStr是MD5的唯一一个公共成员,是最新一次计算结果的     16进制ASCII表示.   */   public String digestHexStr;    /* digest,是最新一次计算结果的2进制内部表示,表示128bit的MD5值.   */   private byte[] digest = new byte[16];    /*   getMD5ofStr是类MD5最主要的公共方法,入口参数是你想要进行MD5变换的字符串   返回的是变换完的结果,这个结果是从公共成员digestHexStr取得的.   */   public String getMD5ofStr(String inbuf) {   md5Init();   md5Update(inbuf.getBytes(), inbuf.length());   md5Final();   digestHexStr = "";   for (int i = 0; i < 16; i++) {   digestHexStr += byteHEX(digest);   }   return digestHexStr;   }   // 这是MD5这个类的标准构造函数,JavaBean要求有一个public的并且没有参数的构造函数   public MD5() {   md5Init();   return;   }   /* md5Init是一个初始化函数,初始化核心变量,装入标准的幻数 */   private void md5Init() {   count[0] = 0L;   count[1] = 0L;   ///* Load magic initialization constants.   state[0] = 0x67452301L;   state[1] = 0xefcdab89L;   state[2] = 0x98badcfeL;   state[3] = 0x10325476L;   return;   }   /* F, G, H ,I 是4个基本的MD5函数,在原始的MD5的C实现中,由于它们是   简单的位运算,可能出于效率的考虑把它们实现成了宏,在java中,我们把它们     实现成了private方法,名字保持了原来C中的。 */   private long F(long x, long y, long z) {   return (x & y) | ((~x) & z);   }   private long G(long x, long y, long z) {   return (x & z) | (y & (~z));   }   private long H(long x, long y, long z) {   return x ^ y ^ z;   }   private long I(long x, long y, long z) {   return y ^ (x | (~z));   }    /*   FF,GG,HH和II将调用F,G,H,I进行近一步变换   FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.   Rotation is separate from addition to prevent recomputation.   */   private long FF(long a, long b, long c, long d, long x, long s,   long ac) {   a += F (b, c, d) + x + ac;   a = ((int) a << s) | ((int) a >>> (32 - s));   a += b;   return a;   }   private long GG(long a, long b, long c, long d, long x, long s,   long ac) {   a += G (b, c, d) + x + ac;   a = ((int) a << s) | ((int) a >>> (32 - s));   a += b;   return a;   }   private long HH(long a, long b, long c, long d, long x, long s,   long ac) {   a += H (b, c, d) + x + ac;   a = ((int) a << s) | ((int) a >>> (32 - s));   a += b;   return a;   }   private long II(long a, long b, long c, long d, long x, long s,   long ac) {   a += I (b, c, d) + x + ac;   a = ((int) a << s) | ((int) a >>> (32 - s));   a += b;   return a;   }   /*   md5Update是MD5的主计算过程,inbuf是要变换的字节串,inputlen是长度,这个   函数由getMD5ofStr调用,调用之前需要调用md5init,因此把它设计成private的   */   private void md5Update(byte[] inbuf, int inputLen) {   int i, index, partLen;   byte[] block = new byte[64];   index = (int)(count[0] >>> 3) & 0x3F;   // /* Update number of bits */   if ((count[0] += (inputLen << 3)) < (inputLen << 3))   count[1]++;   count[1] += (inputLen >>> 29);   partLen = 64 - index;   // Transform as many times as possible.   if (inputLen >= partLen) {   md5Memcpy(buffer, inbuf, index, 0, partLen);   md5Transform(buffer);   for (i = partLen; i + 63 < inputLen; i += 64) {   md5Memcpy(block, inbuf, 0, i, 64);   md5Transform (block);   }   index = 0;   } else   i = 0;   ///* Buffer remaining input */   md5Memcpy(buffer, inbuf, index, i, inputLen - i);   }    /*   md5Final整理和填写输出结果   */   private void md5Final () {   byte[] bits = new byte[8];   int index, padLen;   ///* Save number of bits */   Encode (bits, count, 8);   ///* Pad out to 56 mod 64.   index = (int)(count[0] >>> 3) & 0x3f;   padLen = (index < 56) ? (56 - index) : (120 - index);   md5Update (PADDING, padLen);   ///* Append length (before padding) */   md5Update(bits, 8);   ///* Store state in digest */   Encode (digest, state, 16);   }    /* md5Memcpy是一个内部使用的byte数组的块拷贝函数,从input的inpos开始把len长度的         字节拷贝到output的outpos位置开始   */   private void md5Memcpy (byte[] output, byte[] input,   int outpos, int inpos, int len)   {   int i;   for (i = 0; i < len; i++)   output[outpos + i] = input[inpos + i];   }    /*   md5Transform是MD5核心变换程序,有md5Update调用,block是分块的原始字节   */   private void md5Transform (byte block[]) {   long a = state[0], b = state[1], c = state[2], d = state[3];   long[] x = new long[16];   Decode (x, block, 64);   /* Round 1 */   a = FF (a, b, c, d, x[0], S11, 0xd76aa478L); /* 1 */   d = FF (d, a, b, c, x[1], S12, 0xe8c7b756L); /* 2 */   c = FF (c, d, a, b, x[2], S13, 0x242070dbL); /* 3 */   b = FF (b, c, d, a, x[3], S14, 0xc1bdceeeL); /* 4 */   a = FF (a, b, c, d, x[4], S11, 0xf57c0fafL); /* 5 */   d = FF (d, a, b, c, x[5], S12, 0x4787c62aL); /* 6 */   c = FF (c, d, a, b, x[6], S13, 0xa8304613L); /* 7 */   b = FF (b, c, d, a, x[7], S14, 0xfd469501L); /* 8 */   a = FF (a, b, c, d, x[8], S11, 0x698098d8L); /* 9 */   d = FF (d, a, b, c, x[9], S12, 0x8b44f7afL); /* 10 */   c = FF (c, d, a, b, x[10], S13, 0xffff5bb1L); /* 11 */   b = FF (b, c, d, a, x[11], S14, 0x895cd7beL); /* 12 */   a = FF (a, b, c, d, x[12], S11, 0x6b901122L); /* 13 */   d = FF (d, a, b, c, x[13], S12, 0xfd987193L); /* 14 */   c = FF (c, d, a, b, x[14], S13, 0xa679438eL); /* 15 */   b = FF (b, c, d, a, x[15], S14, 0x49b40821L); /* 16 */   /* Round 2 */   a = GG (a, b, c, d, x[1], S21, 0xf61e2562L); /* 17 */   d = GG (d, a, b, c, x[6], S22, 0xc040b340L); /* 18 */   c = GG (c, d, a, b, x[11], S23, 0x265e5a51L); /* 19 */   b = GG (b, c, d, a, x[0], S24, 0xe9b6c7aaL); /* 20 */   a = GG (a, b, c, d, x[5], S21, 0xd62f105dL); /* 21 */   d = GG (d, a, b, c, x[10], S22, 0x2441453L); /* 22 */   c = GG (c, d, a, b, x[15], S23, 0xd8a1e681L); /* 23 */   b = GG (b, c, d, a, x[4], S24, 0xe7d3fbc8L); /* 24 */   a = GG (a, b, c, d, x[9], S21, 0x21e1cde6L); /* 25 */   d = GG (d, a, b, c, x[14], S22, 0xc33707d6L); /* 26 */   c = GG (c, d, a, b, x[3], S23, 0xf4d50d87L); /* 27 */   b = GG (b, c, d, a, x[8], S24, 0x455a14edL); /* 28 */   a = GG (a, b, c, d, x[13], S21, 0xa9e3e905L); /* 29 */   d = GG (d, a, b, c, x[2], S22, 0xfcefa3f8L); /* 30 */   c = GG (c, d, a, b, x[7], S23, 0x676f02d9L); /* 31 */   b = GG (b, c, d, a, x[12], S24, 0x8d2a4c8aL); /* 32 */   /* Round 3 */   a = HH (a, b, c, d, x[5], S31, 0xfffa3942L); /* 33 */   d = HH (d, a, b, c, x[8], S32, 0x8771f681L); /* 34 */   c = HH (c, d, a, b, x[11], S33, 0x6d9d6122L); /* 35 */   b = HH (b, c, d, a, x[14], S34, 0xfde5380cL); /* 36 */   a = HH (a, b, c, d, x[1], S31, 0xa4beea44L); /* 37 */   d = HH (d, a, b, c, x[4], S32, 0x4bdecfa9L); /* 38 */   c = HH (c, d, a, b, x[7], S33, 0xf6bb4b60L); /* 39 */   b = HH (b, c, d, a, x[10], S34, 0xbebfbc70L); /* 40 */   a = HH (a, b, c, d, x[13], S31, 0x289b7ec6L); /* 41 */   d = HH (d, a, b, c, x[0], S32, 0xeaa127faL); /* 42 */   c = HH (c, d, a, b, x[3], S33, 0xd4ef3085L); /* 43 */   b = HH (b, c, d, a, x[6], S34, 0x4881d05L); /* 44 */   a = HH (a, b, c, d, x[9], S31, 0xd9d4d039L); /* 45 */   d = HH (d, a, b, c, x[12], S32, 0xe6db99e5L); /* 46 */   c = HH (c, d, a, b, x[15], S33, 0x1fa27cf8L); /* 47 */   b = HH (b, c, d, a, x[2], S34, 0xc4ac5665L); /* 48 */   /* Round 4 */   a = II (a, b, c, d, x[0], S41, 0xf4292244L); /* 49 */   d = II (d, a, b, c, x[7], S42, 0x432aff97L); /* 50 */   c = II (c, d, a, b, x[14], S43, 0xab9423a7L); /* 51 */   b = II (b, c, d, a, x[5], S44, 0xfc93a039L); /* 52 */   a = II (a, b, c, d, x[12], S41, 0x655b59c3L); /* 53 */   d = II (d, a, b, c, x[3], S42, 0x8f0ccc92L); /* 54 */   c = II (c, d, a, b, x[10], S43, 0xffeff47dL); /* 55 */   b = II (b, c, d, a, x[1], S44, 0x85845dd1L); /* 56 */   a = II (a, b, c, d, x[8], S41, 0x6fa87e4fL); /* 57 */   d = II (d, a, b, c, x[15], S42, 0xfe2ce6e0L); /* 58 */   c = II (c, d, a, b, x[6], S43, 0xa3014314L); /* 59 */   b = II (b, c, d, a, x[13], S44, 0x4e0811a1L); /* 60 */   a = II (a, b, c, d, x[4], S41, 0xf7537e82L); /* 61 */   d = II (d, a, b, c, x[11], S42, 0xbd3af235L); /* 62 */   c = II (c, d, a, b, x[2], S43, 0x2ad7d2bbL); /* 63 */   b = II (b, c, d, a, x[9], S44, 0xeb86d391L); /* 64 */   state[0] += a;   state[1] += b;   state[2] += c;   state[3] += d;   }    /*Encode把long数组按顺序拆成byte数组,因为java的long类型是64bit的,   只拆低32bit,以适应原始C实现的用途   */   private void Encode (byte[] output, long[] input, int len) {   int i, j;   for (i = 0, j = 0; j < len; i++, j += 4) {   output[j] = (byte)(input & 0xffL);   output[j + 1] = (byte)((input >>> 8) & 0xffL);   output[j + 2] = (byte)((input >>> 16) & 0xffL);   output[j + 3] = (byte)((input >>> 24) & 0xffL);   }   }   /*Decode把byte数组按顺序合成成long数组,因为java的long类型是64bit的,   只合成低32bit,高32bit清零,以适应原始C实现的用途   */   private void Decode (long[] output, byte[] input, int len) {   int i, j;    for (i = 0, j = 0; j < len; i++, j += 4)   output = b2iu(input[j]) |   (b2iu(input[j + 1]) << 8) |   (b2iu(input[j + 2]) << 16) |   (b2iu(input[j + 3]) << 24);   return;   }    /*   b2iu是我写的一个把byte按照不考虑正负号的原则的"升位"程序,因为java没有unsigned运算   */   public static long b2iu(byte b) {   return b < 0 ? b & 0x7F + 128 : b;   }    /*byteHEX(),用来把一个byte类型的数转换成十六进制的ASCII表示,    因为java中的byte的toString无法实现这一点,我们又没有C语言中的   sprintf(outbuf,"%02X",ib)   */   public static String byteHEX(byte ib) {   char[] Digit = { '0','1','2','3','4','5','6','7','8','9',   'A','B','C','D','E','F' };   char [] ob = new char[2];   ob[0] = Digit[(ib >>> 4) & 0X0F];   ob[1] = Digit[ib & 0X0F];   String s = new String(ob);   return s;   }   public static void main(String args[]) {    MD5 m = new MD5();   if (Array.getLength(args) == 0) {//如果没有参数,执行标准的Test Suite    System.out.println("MD5 Test suite:");   System.out.println("MD5(\"\"):"+m.getMD5ofStr(""));   System.out.println("MD5(\"a\"):"+m.getMD5ofStr("a"));   System.out.println("MD5(\"abc\"):"+m.getMD5ofStr("abc"));   System.out.println("MD5(\"message digest\"):"+m.getMD5ofStr("message digest"));   System.out.println("MD5(\"abcdefghijklmnopqrstuvwxyz\"):"+   m.getMD5ofStr("abcdefghijklmnopqrstuvwxyz"));   System.out.println("MD5(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\"):"+   m.getMD5ofStr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"));   }   else    System.out.println("MD5(" + args[0] + ")=" + m.getMD5ofStr(args[0]));     }   }
JSP中的使用方法
-------------------------------------------------------------------------------
<%@ page language='java' %> <jsp:useBean id='oMD5' scope='request' class='beartool.MD5'/> <%@ page import='java.util.*'%> <%@ page import='java.sql.*'%> <html> <body> <% String userid = request.getParameter("UserID");//获取用户输入UserID String password = request.getParameter("assword"); //获取用户输入的Password  String pwdmd5 = oMD5.getMD5ofStr(password);//计算MD5的值  PrintWriter rp = response.getWriter();  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");  Connection con = DriverManager.getConnection("jdbcdbc:community", "", ""); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery("select * from users where userID ='"+userid+"' and pwdmd5= '" + pwdmd5+"'" ); if (rs.next())  { rp.print("Login OK");  } else { rp.print("Login Fail"); } stmt.close(); con.close();  %> </body> </html>
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class MD5Digest
{

    private MessageDigest __md5 = null;
    private StringBuffer __digestBuffer = null;

    public MD5Digest()
        throws NoSuchAlgorithmException
    {
        __md5 = MessageDigest.getInstance("MD5");
        __digestBuffer = new StringBuffer();
    }

    public String md5crypt(String s)
    {
        __digestBuffer.setLength(0);
        byte abyte0[] = __md5.digest(s.getBytes());
        for(int i = 0; i < abyte0.length; i++)
            __digestBuffer.append(toHex(abyte0));

        return __digestBuffer.toString();
    }
    public String toHex(byte one){
   String HEX="0123456789ABCDEF";
   char[] result=new char[2];
   result[0]=HEX.charAt((one & 0xf0) >> 4);
   result[1]=HEX.charAt(one & 0x0f);
   String mm=new String(result);
   return mm;
  }
}


二、再建立一个名为MD5的java文件,内容如下

/************************************************
MD5 算法的Java Bean
@author:Topcat Tuppin
Last Modified:10,Mar,2001
*************************************************/
package beartool;
import java.lang.reflect.*;
/*************************************************
md5 类实现了RSA Data Security, Inc.在提交给IETF
的RFC1321中的MD5 message-digest 算法。
*************************************************/

public class MD5 {
/* 下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define 实现的,
这里把它们实现成为static final是表示了只读,切能在同一个进程空间内的多个
Instance间共享*/
        static final int S11 = 7;
        static final int S12 = 12;
        static final int S13 = 17;
        static final int S14 = 22;

        static final int S21 = 5;
        static final int S22 = 9;
        static final int S23 = 14;
        static final int S24 = 20;

        static final int S31 = 4;
        static final int S32 = 11;
        static final int S33 = 16;
        static final int S34 = 23;

        static final int S41 = 6;
        static final int S42 = 10;
        static final int S43 = 15;
        static final int S44 = 21;

        static final byte[] PADDING = { -128, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        /* 下面的三个成员是MD5计算过程中用到的3个核心数据,在原始的C实现中
           被定义到MD5_CTX结构中
        
         */
        private long[] state = new long[4];  // state (ABCD)
        private long[] count = new long[2];  // number of bits, modulo 2^64 (lsb first)
        private byte[] buffer = new byte[64]; // input buffer
        
/* digestHexStr是MD5的唯一一个公共成员,是最新一次计算结果的
  16进制ASCII表示.
*/
        public String digestHexStr;
        
        /* digest,是最新一次计算结果的2进制内部表示,表示128bit的MD5值.
*/
        private byte[] digest = new byte[16];
        
/*
getMD5ofStr是类MD5最主要的公共方法,入口参数是你想要进行MD5变换的字符串
返回的是变换完的结果,这个结果是从公共成员digestHexStr取得的.
*/
        public String getMD5ofStr(String inbuf) {
                md5Init();
                md5Update(inbuf.getBytes(), inbuf.length());
                md5Final();
                digestHexStr = "";
                for (int i = 0; i < 16; i++) {
                        digestHexStr += byteHEX(digest);
                }
                return digestHexStr;

        }
        // 这是MD5这个类的标准构造函数,JavaBean要求有一个public的并且没有参数的构造函数
        public MD5() {
                md5Init();

                return;
        }
      


        /* md5Init是一个初始化函数,初始化核心变量,装入标准的幻数 */
        private void md5Init() {
                count[0] = 0L;
                count[1] = 0L;
                ///* Load magic initialization constants.

                state[0] = 0x67452301L;
                state[1] = 0xefcdab89L;
                state[2] = 0x98badcfeL;
                state[3] = 0x10325476L;

                return;
        }
        /* F, G, H ,I 是4个基本的MD5函数,在原始的MD5的C实现中,由于它们是
        简单的位运算,可能出于效率的考虑把它们实现成了宏,在java中,我们把它们
       实现成了private方法,名字保持了原来C中的。 */

        private long F(long x, long y, long z) {
                return (x & y) | ((~x) & z);

        }
        private long G(long x, long y, long z) {
                return (x & z) | (y & (~z));

        }
        private long H(long x, long y, long z) {
                return x ^ y ^ z;
        }

        private long I(long x, long y, long z) {
                return y ^ (x | (~z));
        }
        
       /*
          FF,GG,HH和II将调用F,G,H,I进行近一步变换
          FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
          Rotation is separate from addition to prevent recomputation.
       */

        private long FF(long a, long b, long c, long d, long x, long s,
                long ac) {
                a += F (b, c, d) + x + ac;
                a = ((int) a << s) | ((int) a >>> (32 - s));
                a += b;
                return a;
        }

        private long GG(long a, long b, long c, long d, long x, long s,
                long ac) {
                a += G (b, c, d) + x + ac;
                a = ((int) a << s) | ((int) a >>> (32 - s));
                a += b;
                return a;
        }
        private long HH(long a, long b, long c, long d, long x, long s,
                long ac) {
                a += H (b, c, d) + x + ac;
                a = ((int) a << s) | ((int) a >>> (32 - s));
                a += b;
                return a;
        }
        private long II(long a, long b, long c, long d, long x, long s,
                long ac) {
                a += I (b, c, d) + x + ac;
                a = ((int) a << s) | ((int) a >>> (32 - s));
                a += b;
                return a;
        }
        /*
         md5Update是MD5的主计算过程,inbuf是要变换的字节串,inputlen是长度,这个
         函数由getMD5ofStr调用,调用之前需要调用md5init,因此把它设计成private的
        */
        private void md5Update(byte[] inbuf, int inputLen) {

                int i, index, partLen;
                byte[] block = new byte[64];
                index = (int)(count[0] >>> 3) & 0x3F;
                // /* Update number of bits */
                if ((count[0] += (inputLen << 3)) < (inputLen << 3))
                        count[1]++;
                count[1] += (inputLen >>> 29);

                partLen = 64 - index;

                // Transform as many times as possible.
                if (inputLen >= partLen) {
                        md5Memcpy(buffer, inbuf, index, 0, partLen);
                        md5Transform(buffer);

                        for (i = partLen; i + 63 < inputLen; i += 64) {

                                md5Memcpy(block, inbuf, 0, i, 64);
                                md5Transform (block);
                        }
                        index = 0;

                } else

                        i = 0;

                ///* Buffer remaining input */
                md5Memcpy(buffer, inbuf, index, i, inputLen - i);

        }
        
        /*
          md5Final整理和填写输出结果
        */
        private void md5Final () {
                byte[] bits = new byte[8];
                int index, padLen;

                ///* Save number of bits */
                Encode (bits, count, 8);

                ///* Pad out to 56 mod 64.
                index = (int)(count[0] >>> 3) & 0x3f;
                padLen = (index < 56) ? (56 - index) : (120 - index);
                md5Update (PADDING, padLen);

                ///* Append length (before padding) */
                md5Update(bits, 8);

                ///* Store state in digest */
                Encode (digest, state, 16);

        }
         
        /* md5Memcpy是一个内部使用的byte数组的块拷贝函数,从input的inpos开始把len长度的
      字节拷贝到output的outpos位置开始
        */

        private void md5Memcpy (byte[] output, byte[] input,
                int outpos, int inpos, int len)
        {
                int i;

                for (i = 0; i < len; i++)
                        output[outpos + i] = input[inpos + i];
        }
        
        /*
           md5Transform是MD5核心变换程序,有md5Update调用,block是分块的原始字节
        */
        private void md5Transform (byte block[]) {
                long a = state[0], b = state[1], c = state[2], d = state[3];
                long[] x = new long[16];

                Decode (x, block, 64);

                /* Round 1 */
                a = FF (a, b, c, d, x[0], S11, 0xd76aa478L); /* 1 */
                d = FF (d, a, b, c, x[1], S12, 0xe8c7b756L); /* 2 */
                c = FF (c, d, a, b, x[2], S13, 0x242070dbL); /* 3 */
                b = FF (b, c, d, a, x[3], S14, 0xc1bdceeeL); /* 4 */
                a = FF (a, b, c, d, x[4], S11, 0xf57c0fafL); /* 5 */
                d = FF (d, a, b, c, x[5], S12, 0x4787c62aL); /* 6 */
                c = FF (c, d, a, b, x[6], S13, 0xa8304613L); /* 7 */
                b = FF (b, c, d, a, x[7], S14, 0xfd469501L); /* 8 */
                a = FF (a, b, c, d, x[8], S11, 0x698098d8L); /* 9 */
                d = FF (d, a, b, c, x[9], S12, 0x8b44f7afL); /* 10 */
                c = FF (c, d, a, b, x[10], S13, 0xffff5bb1L); /* 11 */
                b = FF (b, c, d, a, x[11], S14, 0x895cd7beL); /* 12 */
                a = FF (a, b, c, d, x[12], S11, 0x6b901122L); /* 13 */
                d = FF (d, a, b, c, x[13], S12, 0xfd987193L); /* 14 */
                c = FF (c, d, a, b, x[14], S13, 0xa679438eL); /* 15 */
                b = FF (b, c, d, a, x[15], S14, 0x49b40821L); /* 16 */

                /* Round 2 */
                a = GG (a, b, c, d, x[1], S21, 0xf61e2562L); /* 17 */
                d = GG (d, a, b, c, x[6], S22, 0xc040b340L); /* 18 */
                c = GG (c, d, a, b, x[11], S23, 0x265e5a51L); /* 19 */
                b = GG (b, c, d, a, x[0], S24, 0xe9b6c7aaL); /* 20 */
                a = GG (a, b, c, d, x[5], S21, 0xd62f105dL); /* 21 */
                d = GG (d, a, b, c, x[10], S22, 0x2441453L); /* 22 */
                c = GG (c, d, a, b, x[15], S23, 0xd8a1e681L); /* 23 */
                b = GG (b, c, d, a, x[4], S24, 0xe7d3fbc8L); /* 24 */
                a = GG (a, b, c, d, x[9], S21, 0x21e1cde6L); /* 25 */
                d = GG (d, a, b, c, x[14], S22, 0xc33707d6L); /* 26 */
                c = GG (c, d, a, b, x[3], S23, 0xf4d50d87L); /* 27 */
                b = GG (b, c, d, a, x[8], S24, 0x455a14edL); /* 28 */
                a = GG (a, b, c, d, x[13], S21, 0xa9e3e905L); /* 29 */
                d = GG (d, a, b, c, x[2], S22, 0xfcefa3f8L); /* 30 */
                c = GG (c, d, a, b, x[7], S23, 0x676f02d9L); /* 31 */
                b = GG (b, c, d, a, x[12], S24, 0x8d2a4c8aL); /* 32 */

                /* Round 3 */
                a = HH (a, b, c, d, x[5], S31, 0xfffa3942L); /* 33 */
                d = HH (d, a, b, c, x[8], S32, 0x8771f681L); /* 34 */
                c = HH (c, d, a, b, x[11], S33, 0x6d9d6122L); /* 35 */
                b = HH (b, c, d, a, x[14], S34, 0xfde5380cL); /* 36 */
                a = HH (a, b, c, d, x[1], S31, 0xa4beea44L); /* 37 */
                d = HH (d, a, b, c, x[4], S32, 0x4bdecfa9L); /* 38 */
                c = HH (c, d, a, b, x[7], S33, 0xf6bb4b60L); /* 39 */
                b = HH (b, c, d, a, x[10], S34, 0xbebfbc70L); /* 40 */
                a = HH (a, b, c, d, x[13], S31, 0x289b7ec6L); /* 41 */
                d = HH (d, a, b, c, x[0], S32, 0xeaa127faL); /* 42 */
                c = HH (c, d, a, b, x[3], S33, 0xd4ef3085L); /* 43 */
                b = HH (b, c, d, a, x[6], S34, 0x4881d05L); /* 44 */
                a = HH (a, b, c, d, x[9], S31, 0xd9d4d039L); /* 45 */
                d = HH (d, a, b, c, x[12], S32, 0xe6db99e5L); /* 46 */
                c = HH (c, d, a, b, x[15], S33, 0x1fa27cf8L); /* 47 */
                b = HH (b, c, d, a, x[2], S34, 0xc4ac5665L); /* 48 */

                /* Round 4 */
                a = II (a, b, c, d, x[0], S41, 0xf4292244L); /* 49 */
                d = II (d, a, b, c, x[7], S42, 0x432aff97L); /* 50 */
                c = II (c, d, a, b, x[14], S43, 0xab9423a7L); /* 51 */
                b = II (b, c, d, a, x[5], S44, 0xfc93a039L); /* 52 */
                a = II (a, b, c, d, x[12], S41, 0x655b59c3L); /* 53 */
                d = II (d, a, b, c, x[3], S42, 0x8f0ccc92L); /* 54 */
                c = II (c, d, a, b, x[10], S43, 0xffeff47dL); /* 55 */
                b = II (b, c, d, a, x[1], S44, 0x85845dd1L); /* 56 */
                a = II (a, b, c, d, x[8], S41, 0x6fa87e4fL); /* 57 */
                d = II (d, a, b, c, x[15], S42, 0xfe2ce6e0L); /* 58 */
                c = II (c, d, a, b, x[6], S43, 0xa3014314L); /* 59 */
                b = II (b, c, d, a, x[13], S44, 0x4e0811a1L); /* 60 */
                a = II (a, b, c, d, x[4], S41, 0xf7537e82L); /* 61 */
                d = II (d, a, b, c, x[11], S42, 0xbd3af235L); /* 62 */
                c = II (c, d, a, b, x[2], S43, 0x2ad7d2bbL); /* 63 */
                b = II (b, c, d, a, x[9], S44, 0xeb86d391L); /* 64 */

                state[0] += a;
                state[1] += b;
                state[2] += c;
                state[3] += d;

        }
        
        /*Encode把long数组按顺序拆成byte数组,因为java的long类型是64bit的,
          只拆低32bit,以适应原始C实现的用途
        */
        private void Encode (byte[] output, long[] input, int len) {
                int i, j;

                for (i = 0, j = 0; j < len; i++, j += 4) {
                        output[j] = (byte)(input & 0xffL);
                        output[j + 1] = (byte)((input >>> 8) & 0xffL);
                        output[j + 2] = (byte)((input >>> 16) & 0xffL);
                        output[j + 3] = (byte)((input >>> 24) & 0xffL);
                }
        }

        /*Decode把byte数组按顺序合成成long数组,因为java的long类型是64bit的,
          只合成低32bit,高32bit清零,以适应原始C实现的用途
        */
        private void Decode (long[] output, byte[] input, int len) {
                int i, j;


                for (i = 0, j = 0; j < len; i++, j += 4)
                        output = b2iu(input[j]) |
                                (b2iu(input[j + 1]) << 8) |
                                (b2iu(input[j + 2]) << 16) |
                                (b2iu(input[j + 3]) << 24);

                return;
        }
      
        /*
          b2iu是我写的一个把byte按照不考虑正负号的原则的"升位"程序,因为java没有unsigned运算
        */
        public static long b2iu(byte b) {
                return b < 0 ? b & 0x7F + 128 : b;
        }
        
/*byteHEX(),用来把一个byte类型的数转换成十六进制的ASCII表示,
 因为java中的byte的toString无法实现这一点,我们又没有C语言中的
sprintf(outbuf,"%02X",ib)
*/
        public static String byteHEX(byte ib) {
                char[] Digit = { '0','1','2','3','4','5','6','7','8','9',
                'A','B','C','D','E','F' };
                char [] ob = new char[2];
                ob[0] = Digit[(ib >>> 4) & 0X0F];
                ob[1] = Digit[ib & 0X0F];
                String s = new String(ob);
                return s;
        }

        public static void main(String args[]) {


                MD5 m = new MD5();
                if (Array.getLength(args) == 0) {   //如果没有参数,执行标准的Test Suite
               
                        System.out.println("MD5 Test suite:");
                System.out.println("MD5(\"\"):"+m.getMD5ofStr(""));
                System.out.println("MD5(\"a\"):"+m.getMD5ofStr("a"));
                System.out.println("MD5(\"abc\"):"+m.getMD5ofStr("abc"));
                System.out.println("MD5(\"message digest\"):"+m.getMD5ofStr("message digest"));
                System.out.println("MD5(\"abcdefghijklmnopqrstuvwxyz\"):"+
                        m.getMD5ofStr("abcdefghijklmnopqrstuvwxyz"));
                System.out.println("MD5(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\"):"+
                      m.getMD5ofStr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"));
                }
                else
                      System.out.println("MD5(" + args[0] + ")=" + m.getMD5ofStr(args[0]));
               
         
        }

}


三、将这两个文件都进行编译,编译后保存在:\WEB-INF\classes\beartool

四、到JSP页面中测试,代码如下:

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%request.setCharacterEncoding("gb2312");%>
<jsp:useBean id='oMD5' scope='request' class='beartool.MD5'/>
    <%
     String password="abc123";
   String pwdmd5 = oMD5.getMD5ofStr(password);
  out.println(pwdmd5);
    %>

  * 类名:MD5Digest<br>
  * 说明:用来进行密码加密的md5公用参数<br>
  * 编写日期:2001/03/05<br>
  * 修改者:<br>
  * 修改信息:<br>
  * @authoredgarlo
  * @version1.0<br>
  */
  
  import java.security.MessageDigest;
  import java.security.NoSuchAlgorithmException;

  public class MD5Digest
  {

  private MessageDigest __md5 = null;
  private StringBuffer __digestBuffer = null;

  public MD5Digest()
  throws NoSuchAlgorithmException
  {
  __md5 = MessageDigest.getInstance("MD5");
  __digestBuffer = new StringBuffer();
  }

  public String md5crypt(String s)
  {
  __digestBuffer.setLength(0);
  byte abyte0[] = __md5.digest(s.getBytes());
  for(int i = 0; i < abyte0.length; i++)
  __digestBuffer.append(toHex(abyte0));

  return __digestBuffer.toString();
  }
  public String toHex(byte one){
  String HEX="0123456789ABCDEF";
  char[] result=new char[2];
  result[0]=HEX.charAt((one & 0xf0) >> 4);
  result[1]=HEX.charAt(one & 0x0f);
  String mm=new String(result);
  return mm;
  }
  }

  --------------------------------------------------------------------------------
  /************************************************
  MD5 算法的Java Bean
  @author:Topcat Tuppin
  Last Modified:10,Mar,2001
  *************************************************/
  package beartool;
  import java.lang.reflect.*;
  /*************************************************
  md5 类实现了RSA Data Security, Inc.在提交给IETF
  的RFC1321中的MD5 message-digest 算法。
  *************************************************/

  public class MD5 {
  /* 下面这些S11-S44实际上是一个4*4的矩阵,在原始的C实现中是用#define 实现的,
  这里把它们实现成为static final是表示了只读,切能在同一个进程空间内的多个
  Instance间共享*/
  static final int S11 = 7;
  static final int S12 = 12;
  static final int S13 = 17;
  static final int S14 = 22;

  static final int S21 = 5;
  static final int S22 = 9;
  static final int S23 = 14;
  static final int S24 = 20;

  static final int S31 = 4;
  static final int S32 = 11;
  static final int S33 = 16;
  static final int S34 = 23;

  static final int S41 = 6;
  static final int S42 = 10;
  static final int S43 = 15;
  static final int S44 = 21;

  static final byte[] PADDING = { -128, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
  /* 下面的三个成员是MD5计算过程中用到的3个核心数据,在原始的C实现中
  被定义到MD5_CTX结构中
  
  */
  private long[] state = new long[4];// state (ABCD)
  private long[] count = new long[2];// number of bits, modulo 2^64 (lsb first)
  private byte[] buffer = new byte[64]; // input buffer
  
  /* digestHexStr是MD5的唯一一个公共成员,是最新一次计算结果的
    16进制ASCII表示.
  */
  public String digestHexStr;
  
  /* digest,是最新一次计算结果的2进制内部表示,表示128bit的MD5值.
  */
  private byte[] digest = new byte[16];
  
  /*
  getMD5ofStr是类MD5最主要的公共方法,入口参数是你想要进行MD5变换的字符串
  返回的是变换完的结果,这个结果是从公共成员digestHexStr取得的.
  */
  public String getMD5ofStr(String inbuf) {
  md5Init();
  md5Update(inbuf.getBytes(), inbuf.length());
  md5Final();
  digestHexStr = "";
  for (int i = 0; i < 16; i++) {
  digestHexStr += byteHEX(digest);
  }
  return digestHexStr;

  }
  // 这是MD5这个类的标准构造函数,JavaBean要求有一个public的并且没有参数的构造函数
  public MD5() {
  md5Init();

  return;
  }
  /* md5Init是一个初始化函数,初始化核心变量,装入标准的幻数 */
  private void md5Init() {
  count[0] = 0L;
  count[1] = 0L;
  ///* Load magic initialization constants.

  state[0] = 0x67452301L;
  state[1] = 0xefcdab89L;
  state[2] = 0x98badcfeL;
  state[3] = 0x10325476L;

  return;
  }
  /* F, G, H ,I 是4个基本的MD5函数,在原始的MD5的C实现中,由于它们是
  简单的位运算,可能出于效率的考虑把它们实现成了宏,在java中,我们把它们
    实现成了private方法,名字保持了原来C中的。 */

  private long F(long x, long y, long z) {
  return (x & y) | ((~x) & z);

  }
  private long G(long x, long y, long z) {
  return (x & z) | (y & (~z));

  }
  private long H(long x, long y, long z) {
  return x ^ y ^ z;
  }

  private long I(long x, long y, long z) {
  return y ^ (x | (~z));
  }
  
  /*
  FF,GG,HH和II将调用F,G,H,I进行近一步变换
  FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
  Rotation is separate from addition to prevent recomputation.
  */

  private long FF(long a, long b, long c, long d, long x, long s,
  long ac) {
  a += F (b, c, d) + x + ac;
  a = ((int) a << s) | ((int) a >>> (32 - s));
  a += b;
  return a;
  }

  private long GG(long a, long b, long c, long d, long x, long s,
  long ac) {
  a += G (b, c, d) + x + ac;
  a = ((int) a << s) | ((int) a >>> (32 - s));
  a += b;
  return a;
  }
  private long HH(long a, long b, long c, long d, long x, long s,
  long ac) {
  a += H (b, c, d) + x + ac;
  a = ((int) a << s) | ((int) a >>> (32 - s));
  a += b;
  return a;
  }
  private long II(long a, long b, long c, long d, long x, long s,
  long ac) {
  a += I (b, c, d) + x + ac;
  a = ((int) a << s) | ((int) a >>> (32 - s));
  a += b;
  return a;
  }
  /*
  md5Update是MD5的主计算过程,inbuf是要变换的字节串,inputlen是长度,这个
  函数由getMD5ofStr调用,调用之前需要调用md5init,因此把它设计成private的
  */
  private void md5Update(byte[] inbuf, int inputLen) {

  int i, index, partLen;
  byte[] block = new byte[64];
  index = (int)(count[0] >>> 3) & 0x3F;
  // /* Update number of bits */
  if ((count[0] += (inputLen << 3)) < (inputLen << 3))
  count[1]++;
  count[1] += (inputLen >>> 29);

  partLen = 64 - index;

  // Transform as many times as possible.
  if (inputLen >= partLen) {
  md5Memcpy(buffer, inbuf, index, 0, partLen);
  md5Transform(buffer);

  for (i = partLen; i + 63 < inputLen; i += 64) {

  md5Memcpy(block, inbuf, 0, i, 64);
  md5Transform (block);
  }
  index = 0;

  } else

  i = 0;

  ///* Buffer remaining input */
  md5Memcpy(buffer, inbuf, index, i, inputLen - i);

  }
  
  /*
  md5Final整理和填写输出结果
  */
  private void md5Final () {
  byte[] bits = new byte[8];
  int index, padLen;

  ///* Save number of bits */
  Encode (bits, count, 8);

  ///* Pad out to 56 mod 64.
  index = (int)(count[0] >>> 3) & 0x3f;
  padLen = (index < 56) ? (56 - index) : (120 - index);
  md5Update (PADDING, padLen);

  ///* Append length (before padding) */
  md5Update(bits, 8);

  ///* Store state in digest */
  Encode (digest, state, 16);

  }
  
  /* md5Memcpy是一个内部使用的byte数组的块拷贝函数,从input的inpos开始把len长度的
        字节拷贝到output的outpos位置开始
  */

  private void md5Memcpy (byte[] output, byte[] input,
  int outpos, int inpos, int len)
  {
  int i;

  for (i = 0; i < len; i++)
  output[outpos + i] = input[inpos + i];
  }
  
  /*
  md5Transform是MD5核心变换程序,有md5Update调用,block是分块的原始字节
  */
  private void md5Transform (byte block[]) {
  long a = state[0], b = state[1], c = state[2], d = state[3];
  long[] x = new long[16];

  Decode (x, block, 64);

  /* Round 1 */
  a = FF (a, b, c, d, x[0], S11, 0xd76aa478L); /* 1 */
  d = FF (d, a, b, c, x[1], S12, 0xe8c7b756L); /* 2 */
  c = FF (c, d, a, b, x[2], S13, 0x242070dbL); /* 3 */
  b = FF (b, c, d, a, x[3], S14, 0xc1bdceeeL); /* 4 */
  a = FF (a, b, c, d, x[4], S11, 0xf57c0fafL); /* 5 */
  d = FF (d, a, b, c, x[5], S12, 0x4787c62aL); /* 6 */
  c = FF (c, d, a, b, x[6], S13, 0xa8304613L); /* 7 */
  b = FF (b, c, d, a, x[7], S14, 0xfd469501L); /* 8 */
  a = FF (a, b, c, d, x[8], S11, 0x698098d8L); /* 9 */
  d = FF (d, a, b, c, x[9], S12, 0x8b44f7afL); /* 10 */
  c = FF (c, d, a, b, x[10], S13, 0xffff5bb1L); /* 11 */
  b = FF (b, c, d, a, x[11], S14, 0x895cd7beL); /* 12 */
  a = FF (a, b, c, d, x[12], S11, 0x6b901122L); /* 13 */
  d = FF (d, a, b, c, x[13], S12, 0xfd987193L); /* 14 */
  c = FF (c, d, a, b, x[14], S13, 0xa679438eL); /* 15 */
  b = FF (b, c, d, a, x[15], S14, 0x49b40821L); /* 16 */

  /* Round 2 */
  a = GG (a, b, c, d, x[1], S21, 0xf61e2562L); /* 17 */
  d = GG (d, a, b, c, x[6], S22, 0xc040b340L); /* 18 */
  c = GG (c, d, a, b, x[11], S23, 0x265e5a51L); /* 19 */
  b = GG (b, c, d, a, x[0], S24, 0xe9b6c7aaL); /* 20 */
  a = GG (a, b, c, d, x[5], S21, 0xd62f105dL); /* 21 */
  d = GG (d, a, b, c, x[10], S22, 0x2441453L); /* 22 */
  c = GG (c, d, a, b, x[15], S23, 0xd8a1e681L); /* 23 */
  b = GG (b, c, d, a, x[4], S24, 0xe7d3fbc8L); /* 24 */
  a = GG (a, b, c, d, x[9], S21, 0x21e1cde6L); /* 25 */
  d = GG (d, a, b, c, x[14], S22, 0xc33707d6L); /* 26 */
  c = GG (c, d, a, b, x[3], S23, 0xf4d50d87L); /* 27 */
  b = GG (b, c, d, a, x[8], S24, 0x455a14edL); /* 28 */
  a = GG (a, b, c, d, x[13], S21, 0xa9e3e905L); /* 29 */
  d = GG (d, a, b, c, x[2], S22, 0xfcefa3f8L); /* 30 */
  c = GG (c, d, a, b, x[7], S23, 0x676f02d9L); /* 31 */
  b = GG (b, c, d, a, x[12], S24, 0x8d2a4c8aL); /* 32 */

  /* Round 3 */
  a = HH (a, b, c, d, x[5], S31, 0xfffa3942L); /* 33 */
  d = HH (d, a, b, c, x[8], S32, 0x8771f681L); /* 34 */
  c = HH (c, d, a, b, x[11], S33, 0x6d9d6122L); /* 35 */
  b = HH (b, c, d, a, x[14], S34, 0xfde5380cL); /* 36 */
  a = HH (a, b, c, d, x[1], S31, 0xa4beea44L); /* 37 */
  d = HH (d, a, b, c, x[4], S32, 0x4bdecfa9L); /* 38 */
  c = HH (c, d, a, b, x[7], S33, 0xf6bb4b60L); /* 39 */
  b = HH (b, c, d, a, x[10], S34, 0xbebfbc70L); /* 40 */
  a = HH (a, b, c, d, x[13], S31, 0x289b7ec6L); /* 41 */
  d = HH (d, a, b, c, x[0], S32, 0xeaa127faL); /* 42 */
  c = HH (c, d, a, b, x[3], S33, 0xd4ef3085L); /* 43 */
  b = HH (b, c, d, a, x[6], S34, 0x4881d05L); /* 44 */
  a = HH (a, b, c, d, x[9], S31, 0xd9d4d039L); /* 45 */
  d = HH (d, a, b, c, x[12], S32, 0xe6db99e5L); /* 46 */
  c = HH (c, d, a, b, x[15], S33, 0x1fa27cf8L); /* 47 */
  b = HH (b, c, d, a, x[2], S34, 0xc4ac5665L); /* 48 */

  /* Round 4 */
  a = II (a, b, c, d, x[0], S41, 0xf4292244L); /* 49 */
  d = II (d, a, b, c, x[7], S42, 0x432aff97L); /* 50 */
  c = II (c, d, a, b, x[14], S43, 0xab9423a7L); /* 51 */
  b = II (b, c, d, a, x[5], S44, 0xfc93a039L); /* 52 */
  a = II (a, b, c, d, x[12], S41, 0x655b59c3L); /* 53 */
  d = II (d, a, b, c, x[3], S42, 0x8f0ccc92L); /* 54 */
  c = II (c, d, a, b, x[10], S43, 0xffeff47dL); /* 55 */
  b = II (b, c, d, a, x[1], S44, 0x85845dd1L); /* 56 */
  a = II (a, b, c, d, x[8], S41, 0x6fa87e4fL); /* 57 */
  d = II (d, a, b, c, x[15], S42, 0xfe2ce6e0L); /* 58 */
  c = II (c, d, a, b, x[6], S43, 0xa3014314L); /* 59 */
  b = II (b, c, d, a, x[13], S44, 0x4e0811a1L); /* 60 */
  a = II (a, b, c, d, x[4], S41, 0xf7537e82L); /* 61 */
  d = II (d, a, b, c, x[11], S42, 0xbd3af235L); /* 62 */
  c = II (c, d, a, b, x[2], S43, 0x2ad7d2bbL); /* 63 */
  b = II (b, c, d, a, x[9], S44, 0xeb86d391L); /* 64 */

  state[0] += a;
  state[1] += b;
  state[2] += c;
  state[3] += d;

  }
  
  /*Encode把long数组按顺序拆成byte数组,因为java的long类型是64bit的,
  只拆低32bit,以适应原始C实现的用途
  */
  private void Encode (byte[] output, long[] input, int len) {
  int i, j;

  for (i = 0, j = 0; j < len; i++, j += 4) {
  output[j] = (byte)(input & 0xffL);
  output[j + 1] = (byte)((input >>> 8) & 0xffL);
  output[j + 2] = (byte)((input >>> 16) & 0xffL);
  output[j + 3] = (byte)((input >>> 24) & 0xffL);
  }
  }

  /*Decode把byte数组按顺序合成成long数组,因为java的long类型是64bit的,
  只合成低32bit,高32bit清零,以适应原始C实现的用途
  */
  private void Decode (long[] output, byte[] input, int len) {
  int i, j;

  
  for (i = 0, j = 0; j < len; i++, j += 4)
  output = b2iu(input[j]) |
  (b2iu(input[j + 1]) << 8) |
  (b2iu(input[j + 2]) << 16) |
  (b2iu(input[j + 3]) << 24);

  return;
  }
  
  /*
  b2iu是我写的一个把byte按照不考虑正负号的原则的"升位"程序,因为java没有unsigned运算
  */
  public static long b2iu(byte b) {
  return b < 0 ? b & 0x7F + 128 : b;
  }
  
  /*byteHEX(),用来把一个byte类型的数转换成十六进制的ASCII表示,
   因为java中的byte的toString无法实现这一点,我们又没有C语言中的
  sprintf(outbuf,"%02X",ib)
  */
  public static String byteHEX(byte ib) {
  char[] Digit = { '0','1','2','3','4','5','6','7','8','9',
  'A','B','C','D','E','F' };
  char [] ob = new char[2];
  ob[0] = Digit[(ib >>> 4) & 0X0F];
  ob[1] = Digit[ib & 0X0F];
  String s = new String(ob);
  return s;
  }

  public static void main(String args[]) {

  
  MD5 m = new MD5();
  if (Array.getLength(args) == 0) {//如果没有参数,执行标准的Test Suite
  
  System.out.println("MD5 Test suite:");
  System.out.println("MD5(\"\"):"+m.getMD5ofStr(""));
  System.out.println("MD5(\"a\"):"+m.getMD5ofStr("a"));
  System.out.println("MD5(\"abc\"):"+m.getMD5ofStr("abc"));
  System.out.println("MD5(\"message digest\"):"+m.getMD5ofStr("message digest"));
  System.out.println("MD5(\"abcdefghijklmnopqrstuvwxyz\"):"+
  m.getMD5ofStr("abcdefghijklmnopqrstuvwxyz"));
  System.out.println("MD5(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\"):"+
  m.getMD5ofStr("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"));
  }
  else
  System.out.println("MD5(" + args[0] + ")=" + m.getMD5ofStr(args[0]));
  
  
  }

  }

  JSP中的使用方法

  -------------------------------------------------------------------------------
  <%@ page language='java' %>
  <jsp:useBean id='oMD5' scope='request' class='beartool.MD5'/>

  <%@ page import='java.util.*'%>
  <%@ page import='java.sql.*'%>
  <html>
  <body>
  <%
  String userid = request.getParameter("UserID");//获取用户输入UserID
  String password = request.getParameter("assword"); //获取用户输入的Password
  
  String pwdmd5 = oMD5.getMD5ofStr(password);//计算MD5的值
  
  PrintWriter rp = response.getWriter();
  
  Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
  
  Connection con = DriverManager.getConnection("jdbcdbc:community", "", "");

  Statement stmt = con.createStatement();

  ResultSet rs = stmt.executeQuery("select * from users where userID ='"+userid+"' and pwdmd5= '" + pwdmd5+"'" );

  if (rs.next())
  {
  rp.print("Login OK");
  
  }
  else
  {
  rp.print("Login Fail");
  }

  stmt.close();
  con.close();
  
  %>


unto很实用很暴力的JSP打造自己的收发邮件系统next阿里巴巴自动信息发布软件
回复

使用道具 举报

0

主题

632

帖子

628

积分

积分
628
信息发布软件沙发
发表于 2017-7-7 00:54:51 | 只看该作者
,样子不错,厂家给力

回复 支持 反对

使用道具 举报

0

主题

586

帖子

582

积分

积分
582
推广工具板凳
发表于 2017-7-13 03:49:33 | 只看该作者
意思,出差一直没顾上。微信平台开发找你们做绝对是正确的选择。服务是值得肯定的,售后也非常到位,技术支持很强大,重点是热心.不厌其烦。不像有些玩技术的那个清高啊,那个沟通难度啊真不是一般的高。

回复 支持 反对

使用道具 举报

0

主题

632

帖子

630

积分

积分
630
软件定制开发地板
发表于 2017-7-13 12:04:19 | 只看该作者
然中间有些波折,对设计结果还是比较满意的。好评。

回复 支持 反对

使用道具 举报

0

主题

591

帖子

591

积分

积分
591
5#定制软件#
发表于 2017-7-15 12:59:13 | 只看该作者
,风格很赞,系统很稳定。很好。

回复 支持 反对

使用道具 举报

0

主题

636

帖子

624

积分

积分
624
6#定制软件#
发表于 2017-7-17 15:41:35 | 只看该作者
搞了,雏形出来了,看起来真不错,还有多谢工作人员耐心指导。

回复 支持 反对

使用道具 举报

0

主题

596

帖子

677

积分

积分
677
7#定制软件#
发表于 2017-7-17 17:30:40 | 只看该作者
快,而且都完美解决!

回复 支持 反对

使用道具 举报

0

主题

612

帖子

596

积分

积分
596
8#定制软件#
发表于 2017-7-20 05:47:30 | 只看该作者
服务超好

回复 支持 反对

使用道具 举报

1

主题

2204

帖子

565

积分

积分
565
9#定制软件#
发表于 2017-7-21 23:15:57 | 只看该作者
好,专业的就是不一样,价格很便宜,大公司,给中评是因为对客服的无语

回复 支持 反对

使用道具 举报

0

主题

623

帖子

612

积分

积分
612
10#定制软件#
发表于 2017-7-24 04:21:06 | 只看该作者
服务也好。谢谢卖家帮我解决。

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

相关导读
群发软件然猫首码网全自动发帖软件
然猫首码网全自动发帖软件,然猫首码网这个网站是一种全新的后台,这类网站有点像博客系统,都是打一个量大挑几页收录好的作为标杆,从而推高他们的发帖收录效果,还别说,百度蜘蛛就爱这套打法,他们收录系统都没有太大的转变了,也不【知】道他们是不是没有钱买硬盘了,现在都是一些存量竞争效果,就是收录了您,他就可能被收录系统给 T 出自己的收录系统内了。全部其实都是这样的打法,现在淘宝论坛,天涯又从新开启,实际都是
群发软件学术皮匠网站自动发提问软件
学术皮匠网站自动发提问软件,这个网站注册是拖动验证码,注册成功后就可以无限的群发起来,账号似乎没有啥限制,不过内容是比较麻烦的输入方式,我试过各种种样的方法都好像不行,这个就除了用 POST 的方式提交内容,还有座标点击一下,然后复制粘帖板再粘帖内容会好一些,其它方式都感觉不是很好用,以前遇到这个编辑框是点一下源码再开一下所见所得方式,就可以把内容整进去,可是这个网站他把编辑框给删除了,导致现在只用了粘
群发软件大河商务网自动 B2B 发布帖子软件
大河商务网自动 B2B 发布帖子软件,这个网站和别的模板不同,它是所有版块都可以发,一时又只能发几个版块,所以软件把所有版块都放到了列表供大家选择,有时候网站就是这样,调来调去的,您还要适合他的操作,不然就只能发不了的状态,网站的版块顺序和别的也不同,要是看到他有更改,就可以把版块网址给重新放到列表中去,其实版块就是发帖的那个网址数字不同而已,其它是没有区别的,但一定要添加对的,不然输入内容后就会变成
群发软件乐优网POST版本发帖软件
乐优网POST版本发帖软件,这个网站是 B2B 网站,由于和别的网站不同,所以导致通用脚本全部失效了,单独做一个 POST 版本的,这样方便管理,B2B 软件最好还是单独的好,如果每一个网站都用了通用设置,收录自然会极差,因为百度不喜欢啃过的口香糖哦,每一个网站单独设置,可以做到完全不同,内容可以多样多变,有一些事您看似做了无用功,看似很麻烦,但实际效果肯定会更好,这可不是做无畏的事,而是收录的习惯摆在那里,自然不
群发软件貔貅商贸网全自动B2B网站软件
貔貅商贸网全自动B2B网站软件,这个网名字看上去会不会有点难,估计是百分之九十的人都不会拼写出来吧,说归说,这个网站现在收录还蛮好的,属于独苗的存在,这个脚本的要求的客户也是比较奇思妙想的,他想标题内容图片相互对应起来,他发的这些五百多个产品,都是化肥类的,所以品种有很多,内容和标题图片想对应,必须要统一战线,其实也是可以实现的,只要图片加上标记就行,比如图片和内容,里面有一个统一的关键字,如甲笨胺
群发软件GITEE网站主页自动全发全采集软件
GITEE网站主页自动全发全采集软件,这个网站的牛程度就不用更新了吧,几乎是发啥都会被秒收录的网站,这个脚本可不是整什么发帖,或是发日志的,而是更新个人主页的脚本,老三样,标题就是微博的姓名,而这个简介就是他需要提交的内容,就这两个东东组成了我们要发的宣传广广告,之后就是把主页网址采集下来,保存到记事本中,这个脚本可不是什么注册的脚本哈,先前已经更新过注册的样板了吧,也是这个网站的,但这个脚本只是写入
群发软件语言中文网全自动发帖工具
语言中文网全自动论坛发帖软件,这个网站发主题,极量比较高,可能前期发的代码太多,蜘蛛根本不懂是什么,以为又是原创,再加上发布人多,人气在那收录自然差不了哪去,估计他们的程序员都很多跑去上面折腾代码的吧,开局好自然发日志或是发主题收录会好的不得了,可是却很少人跑来发,不【知】道为什么,可是秒收录的网站哦,发网址也可以秒收录的网站,不能错过,不过注册需要一个手机号码收验证码才会比较容易注册,登陆是不能
群发软件铁甲论坛全自动发布软件
铁甲论坛全自动发布软件,初看这个网站您可能以为是什么军事的论坛,其实它只是一个普通的挖土机的论坛,网站对于手机版块收录会比较好,发帖是一种头条形式的,内容只能用文本格式,不能超过五千字,不过可以自己在头条发帖的地方添加上版块,账号发帖有限制的,可以准备多个账号放到这个脚本里自动运行,这样就可以实现 N 多的帖子同时发送的过程,发帖成功,有一个提示,软件用了一个点击确定这个提示后,网站自动会跳转到发帖
群发软件沙龙艺术网自动日志群发
沙龙艺术网自动日志群发,这个网站可不是让您去点投稿的,而是偷偷进个人中心发日志的,这个虽然是普通的论坛,但如果网站没有关闭发日志的版块,是可以一直发日志的,不过他时间把控很严格,您发的太快,立即会被限制 15 秒的时间,如果您按正常的几十秒去操作的话,就会让您顺利通过所有控制和局限性,这个脚本是昨天注册然后发日志缓存的操作,他网站限制着每一个账号发帖就要隔十五秒才可以操作下一个日志,不过您如果每一帖都
群发软件沙龙艺术网注册账号激活账号软件
沙龙艺术网注册账号激活账号软件,这个网站是 DZ 模板论坛,注册是利用邮箱账号进行注册,然后通过邮箱激活网址就可以把账号弄好,软件利用临时邮箱收到了信件,采集好网址,然后访问一次激活码网址就可以完成激活账号,注册还是蛮方便的,没有半个验证码,也不封 IP,可以自由发挥出 N 多账号起来,而且完全是免费的,有蜘蛛池的话,对于这种网站是极度友好的,就怕没有的话就歇菜了。注册好账号,软件会自动保留缓存,放在发帖脚
群发软件53货源网全自动群发工具
53货源网全自动群发工具,会员登陆后就可以发帖,这个网站是发布货源的网站,相当于一些工厂货源发布的网站,厂家是比较多人来这里发的,网站也比较新鲜,不像是一些 B2B 网站照样直接就拿来用的网站,真的,有的网站本来是很有机会的,可是他们非不愿意自我放开,导致扣扣爽爽的,结果就让很多货源的人不【知】道去哪里发,换句话说,有的人有资源找不到发的地方,有的人有资源,却不【知】道哪里找到客户发,这就有点悲了,本来
群发软件华中贸易网全自动群发软件
华中贸易网全自动群发软件,这个网站是 B2B 网站,现在这类网站对于上传图片 POST 这块会有比较大的区别,有的是要自定义后缀,有的是要对应后缀,比如是 PNG 或是 jpg 的都可以,这个网站五大分类都可以发,像供应,资讯这些会收录比较好,软件对于这个 POST 会比较友好,但调试是很麻烦的,有时候多一个空格也不行的,网站对于数据流处理是很严格,或是说他们容易很低,不管收录有好有差的一边,这类网站有时候收录极好,有时候
群发软件168信息网自动发帖软件
168信息网自动发帖软件,这个网站是 B2B 网站,和以前做的都不同,它是一个新人开发的平台,收录比其它的都好,可见作者是不是打的批量版,而是打精品战略的人,有的人喜欢搞大军团作战,有的人喜欢搞尖刀式作战,各有各的优点,看自己能力圈在哪里就往哪里发展才是最优选择吧,如果有能力那肯定是尖刀式的省钱,但没有,那就只能做批量创造收录的概率呢,就像成功的事常做一样,只需要把量打上去,一样可以达到那种效果的,所有的
群发软件云推送网站网站自动发布帖子软件
云推送网站自动发帖软件,这种网站也是 B2B 改版过来的,不过他看上去会比较新鲜一些,毕境很多功能像是以前的那些搜了网的功能,这种平台发帖多,收录主要是靠提交给百度蜘蛛池的,如果没有自己的池子,是很难被百度这老人家强行收录的,网站比较简单,但可以刷新信息,和这个发资讯的脚本一起上传,听说刷新收录快,不【知】道是不是真的哈,软件自动登陆账号,自动发帖,导入标题内容,要和网站开 VIP 会员,不然是发不了帖子的
群发软件站站网全自动群发软件
站站网全自动群发软件,这个软件是 B2B 网站,现在这类网站发的人越来越多,反正有这样的市场,那些单个的网站反而没有什么好戏码,这类网站批量生成的,有好的会留下,收录不好的,自然就会被换一个域名,换一个网站空间重新去做,然后留下就会越来越好了,软件只要导入标题内容,导入账号就可以全自动发帖,如果用软件自动发帖,就可以省了很多手工操作,比如他能一年挂机不用操作心,只要自己准备好账号密码和标题内容就可以全
群发软件投聂网全自动B2B发布帖子工具
投聂网全自动B2B发布帖子工具,这个网站是 B2B 网站来的,自己可以自主充值,这些 B2B 网站可能没有秒收录,但月收录还是有的,他们打的都是一个批量生产,相当于边发边收录,还是边发,您说终竟的最终收录,他们是肯定没有咯,而这些理论上存在的例子也不是那么好的呈现在上面,这个网站也分为 PC 端一个,POST 后台版一个,都做了一个脚本吧,免得有的人喜欢爱好都不同,也能闭出一个不会的理由出来,有了这两个版本就不同,他们
信息发布软件旅法师营地创作平台自动发布帖子软件
旅法师营地创作平台自动发布帖子软件,这个网站发帖的步骤会很多,做完后要三十多步,他要选图片,又要上传封面图片,确定选择版块这些,整的头都痛的节奏,现在还有哪一个平台这么复杂的哈,网站是手机验证码登陆的,自己要注册一堆账号,他每一个号只能发一帖,这种这么偏避的平台,还是没有什么人抢着注册的,随便找一个 API 就可以注册一堆的号,网站游戏论坛,收录不会差到哪去的,就是步骤比较繁琐,只要做好一次,倒计时足
群发软件五洲商务网全自动发布帖子软件
五洲商务网全自动发布帖子软件,这个网站是 B2B 网站,继续弄两个版本吧,一个是 POST 的,一个是普通的版本,对于搜狗来说,这些网站效果还是很好的,很多人傻白甜分不出什么是什么吧,所以一直有人在用,不过这些现在都不重要了吧,百度自己也没有什么大的更新,感觉有点修修补补,几乎要放弃了,可是规则上加码,完全不管收录了,这个网站,只要有号就可以发,所有什么供应,采购,行情,这些信息都会自动切换着发,从头部切换
群发软件CSDN网站自动发注册账号软件
CSDN网站自动发注册账号软件,这个软件是利用短信验证码,大批量的注册 CSDN 网站的账号的,注册的时候发现居然没有验证码,以前这个网站是丢外链的圣地,现在倒是管的严格,收录也没有以前那么好了,发现他注册账号完全不用验证码了,这倒是一件值得看的好事,只要收一个短信码,就可以顺利注册成功,不过初始账号还是比较多的,需要输入新的用户名,点确定就可以注册成功,它网站注册成功会跳到主页去,然后软件判断主页代码,进
群发软件gitee网站注册账号软件
gitee网站注册账号软件,这个网站有一个拖动验证码,有一个字母验证码,以前是做过的,现在换一个短信平台,就可以直接注册成功,并且把缓存给采集到列表备用,这个网站收录是几乎无敌的状态,所以账号是肯定值钱的,您如果有什么外链,可以丢到这个网站进行跑蜘蛛,这个网站有点像以前的 CSDN 网站,CSDN 以前是超多漏洞的,不【知】道以前发过的人有没有记过,发外链几乎秒收录,可是他自己太作做了,非要改变,导致收录不同往日
群发软件秀购网全自动发布帖子软件
秀购网全自动发布帖子软件,这是一个 B2B 网站,只是做了一个 POST 脚本,一个普通网页的脚本,他们的限制是比较少的,网站个人中心也可以联系 QQ 充值,这些可不是我们软件的平台,他们找的网站都有这些,软件中您想节省电脑资源的,可以用 POST 版本,想看过程的就用 PC 普通的版本,两个有好也有差的一方面,但收录都是一样的,图片放到软件的列表中去,他能自动的传上网站去的,但图片后缀只能用 JPG,其它格式不能上传上去,
群发软件武法出租车论坛全自动发布帖子软件
武法出租车论坛全自动发布帖子软件,这个论坛版块是比较多的,而且是一种动态验证码,它是一种典型的养网站例子了,不过您要是没有买到内部账号,发帖是比较费劲的,因为一个号只能发两个帖子,软件先是自动的写入网页缓存账号,写入缓存是只能有两个论坛发帖参数的,如果不然,您一会发帖的验证码,他永远提示您是错误的,针对这些有登陆验和发帖验证码的,都必须按这个脚本这样写入缓存才可以。这个可以作为动态验证码论坛例子,
群发软件导列网全自动群发软件
导列网全自动群发软件,这是一个 B2B 网站,做一个普通网页版的群发软件,做一个后台 POST 提交的软件,软件没有太多折腾的地方,全部都是自动操作的,导入标题内容就可以全自动发帖子,图片一定要有 JPG 后缀的,不然会在 POST 脚本上传不了图片,内容的图片可以加在内容 2 或是内容 3 里,这样发出去带 IMG 的标签,就会显示到内容图片里,您发帖的时候,在内容框里上传一次,内容会自动的带在图片里面穿插进去,弄二个脚本,一
群发软件快手图文自动发布软件
快手图文自动发布软件,图文发布实际就是传一张图片,然后加上标题和内容,和上传视频一样,他都是一样的操作,只是内容不能超过一千字,不然会发不出去的,手机 APP 上也会有这样的限制,视频对于这个网站来说发的比较多,图文虽然流量很大,但却是没有多少人有耐心看完所有的文章的,都几乎往视频流里里折腾,图文这个可不是靠什么百度收录的,他们就像 BIBI 网站这些一样,全靠自身的超大 IP 流量进行粘帖用户,相当于一个大的
群发软件百家号头条全自动群发软件
百家号头条发送软件,这个头条是自备文章导入发送的,之所以新瓶装旧酒是因为这个是有技巧的发送,他是利用一个 HTML 编辑平台的转换代码,让自己可以在百家号发送头条号不被删除除,文章估计都是用通过小炎号类似的人工智能创作平台进行攒写的,所以都比较容易不被删除的,而且很容易被百度收录,现在几乎没有人会通过自己手打出来,软件先是 HTML 平台把代码给转换一下,再用软件的复制全赞功能,把内容给写进了粘帖板,写入缓存
群发软件知乎个人主页自动设置软件
知乎个人主页自动设置软件,用缓存去写入【知】乎个人主页名称,他是 180 天才能改一次的名称,还有他里面的个性签名,他的职业介绍,都成了百度蜘蛛超级爱好的地方,只是注册一个号只能改一次,这着实有点浪费 RMB 了,不过效果是好的很的,第一来,也极少会被封号,就算号被封了,他的个人主页还在那,名称也不会变,致少还一直在那,二来还是要找到手机好的平台,才可以这样玩,价格不贵,脚本这个是廷续昨天的那个,这个是设置
群发软件知乎自动注册软件脚本下载地址
知乎自动注册软件,这个网站管的是比较严格的,而且验证码也是比较恶心的那种,但对接飞码这个平台还是可以注册不少的账号,如果这个平台没有号码了,也可以更换到其它平台的 API 里,软件并不限制您对接哪一个 API 接口的,只要有随便可以改的,像什么俄罗斯或是其它国家的号码都是可以收到的,只要短信一接,就可以登陆,有的平台限制多,有的平台限制极少的,这个脚本主要是提供注册,〖逻辑〗判断是比较多的,各种判断有没有登
群发软件搜客商务网全自动发帖软件
搜客商务网全自动发布帖子软件,这个网站也是 B2B 网站,做两个版本供后续使用,网站传图片一定要注意,这个脚本默认是 JPG 的,如果需要改成其它格式,他网站是不能自动识别的,需要改脚本上传动作,只要把上传动作改成对应的后缀格式就可以,但没有经验的最好不要去动吧,JPG 图片用的比较多,就用这个就可以了,也没有什么很卷的操作吧,各种各样的格式,如果不是为了美化什么的,没有多大的必要,网站每发一帖就要付一角钱的节
群发软件商务导航网全自动发布软件
商务导航网全自动发布软件,这个网站也是 B2B 网站,只做分类信息发布,现在的目标是把所有这些 B2B 网站进行大切换,做一个 POST 版本,一个 PC 普通的版本,像昨天的那个网站,居然玩的是手机收录的接口,而这个倒是中规中矩的网站,只要有 VIP 都发帖就可以了,没有太多的限制,不是 VIP 也不给发帖,全部是走会员路线的,网站只要有点收录,就有一大群人往里面堆量的,现在 B2B 网站都成了这个常态,然后收录又会慢慢下滑,然
群发软件发财草网站自动发帖软件
发财草网站全自动发布软件,这个网站倒是蛮新的,他有点像分类 58 同城网的模块,现在倒是落了一个清静的网站,专攻什么手机 APP 里去了,越来越麻烦的地方,这个网站还是B2B后台类似的,能不能收录,完全看发的数量,发的多了,收录自然就好了,如果发的少就很难说了,免费发的时候还会有一个验证码比较麻烦的,网站只能发一个地方,就是资讯的版块,也不用做太多〖逻辑〗判断了,软件还是做了两个脚本,一个是 POST,一个是普通
群发软件爱搜群网站自动发布软件
爱搜群网站自动发布软件,这个也是 B2B 网站,网站现在免费发帖都有验证码,每天有十帖的免费,都是集人气的一种措施,不过免费的发的这么少自然效果不会好到哪去,这个要了解哈,毕竟水桶的容易是按他的短板计算的,可不是什么随随便便可以改变的事,这个脚本分二个脚本,一个是后台运行,但您必须开好会员,不然肯定发不成功的,这可不是 POST 就可以自动的跨越他的限制,就直接可以发了,这是不可能的,除非人家允许这样免费哈
群发软件银盾皇全自动发帖软件
银盾皇全自动发帖软件,这里两个版本,一个是 POST 版本,一个是普通版本的,很多人非要弄两个版本去发一个网站,有时候需要快,有时候需要看到过程,所以很多 B2B 网站改成了两个版本,网站发帖是比较简单的,有账号就可以发,他们 B2B 网站本来就是用来发广告的,他们充好会员就可以一直发帖,网站是一种计件方式的,每发一帖就扣多少钱,网站越好,收费就越贵一些,便宜的网站也有人发,那些家伙也有的是图心里安慰的,也不【知
群发软件跑列网全自动发布软件
跑列网全自动发布软件,这个是 B2B 网站来的,只要导入好标题和内容,放好会员号就可以全自动发帖,这个是后台发送的版本,和普通的版本,只要有号就可以全自动发,两个版本放在上面了,看电脑吃饭,第一个就用的是普通版本,他能看到过程,一个是 POST 过程,他全程后台运行,可以多线程,发的会比较快,几乎不占电脑资源,后台静默运行,针对差劲的电脑设计的,不过您看不到过程有时候会心慌慌,人就是对没有掌控感的东西会产生
群发软件小木虫论坛自动软件
小木虫论坛自动发布帖子软件,这个脚本是手机版的,所以还是有必要发布一下的,网站每年这几个月,会超多人用,所以到处找这个软件的人也比较多,而 PC 不管是用的 POST 还是啥,都容易被封号,但是这个 WAP 端应该是老掉牙的地方,所以防火墙会有一个漏洞的,这个网站主要是内部号发的比较多,也就是他们自己的号,小号发还是有机率会被封的,最好有能力的还是拿到内部号,这个端的会发的比较快,可以自己发一些版块,导入比较多
群发软件鲁德软件平台提问软件
鲁德软件平台提问软件,这个网站是一种软件平台来的,软件在这个网站的提问版块进行提问,因为是提问的,一般一个账号就可以发很多,不过他是有一个极验证码的,软件这个脚本用的是图鉴平台进行打码,识别还是很便宜的,直接可以拖动对,没有用 POST 的那个极验证码平台,感觉他们现在已经差不多了,时代在进步,人工智能找这些图片座标还是像爸爸打三岁小孩似的,随便下手。不过这个网站和的是缓存登陆哦,第一次发,您可要自己登
群发软件爱搜网全自动群发工具
爱搜网全自动群发软件 POST 版,这个网站只有两个分类,一个是产品供应分类,一个是资讯分类,产品供应分类的系数是 25 这个可能网站自己也没有关注到问题所在,一般是 21 系数收录才会好,好在资讯这个默认了,对于收录,这些网站都已经被百度蜘蛛给训化了,人家都会按惯性的方式去爬行,如果您想另起一门旗帷,那就只能说抱歉了,您还没有那个实力与之抗争,还不要说,人家现在技术性的业务是比较少的,您想让他改变那种爬行方式
信息发布软件POST 中巴网全自动群发软件
POST 中巴网全自动群发软件,这个是 B2B 网站,不过以前都是做的普通版本,这个是 POST 版本,可以节省电脑很多资源,可以不占用后台,可以后台静默运行,可以飞快的跳过一些错误,可以秒完成发帖过程,自动后台传图片,然后采集图片地址,进行采集保留,再判断里面有哪一些分类,再把分类随机切换,这个标题可以加长的模式,内容也是不被限制的发帖模式,因为是后台运行,他这些限制的都是页面 JS 限制的,不过您要不是网站会员,
群发软件乐扫网 B2B 网站全自动发送软件
乐扫网 B2B 网站全自动发送软件,这个网站也是 B2B 网站来的,有的人总是在迷茫中生活着,总是说找不到网站发,那您就可以弄几个这样的 B2B 网站先把池水动起来呀,为什么一直在纠结那些秒收不秒收的事呢,很多网站前期是沉默的,某天东风将至,收录直接就飞速上升了,这些网站现在都有这种特点,不过他们也不【知】道,现在有很多论坛更是牛,收录比这些快的多,可不是什么 DZ 论坛,而是一些主题论坛,也是这样,某几天收录超级
群发软件记得网 B2B 网站全自动群发软件
记得网 B2B 网站全自动群发软件,这个网站也是 B2B 网站分类来的,他对搜狗收录会比较好,不过谷歌居然也有很高的收录,不【知】道他是走的啥运气了,百度收录差一些了,现在几乎很少人玩这些,不过有收录就有流量肯定的,国内国外都有,网站现在已经做了这种 B2B 网站模板了,全部过程只需要改一个地方,那就是网址列表的网址,您换了网站,只要把域名放进去,全部就会自动的,不管您想发供应,还是产品,还是行情这些分类,软件
群发软件尚格论坛自动发布帖子软件
尚格论坛自动发帖软件,这个只是普通的论坛,但因为先前是地方论坛来的,人气还可以的,收录也不会差到哪去,论坛是用户名登陆的,他一个页面有手机登陆,这个可不是通用的登陆接口,普通登陆是登陆不上的,只能用户名登陆的接口才可以,注册账号的时候要注意,不是手机号码登陆的,注册是手机号码,但是用户名才有效果的,发帖的时候没有验证码,一个账号可以无限的发送。只是发帖时间要十秒以上,不然他可是会出验证码给您按排上
群发软件驴在陌自动发提问文章软件
驴在陌自动发提问软件,这个网站是发旅行日记和路线的,不过日记这里肯定收录的比较好一些的。只是他登陆的地方只能用微信搜码登陆,短信验证码登陆,收录后还是要跑百度蜘蛛池的,不然基本不会有收录量的,发帖还有一个字母的验证码,您还必须写上,不然是不给发帖的,网站间隔时间是三十秒一帖,如果要快就只能加多几个号同时开脚本去发的。内容这里需要用座标的输入方法去整,不然是没有用的,因为他不让源码输入,也不用逐字输
群发软件Apipost网站自动发博客软件
Apipost 网站自动博客发帖软件,这个网站登陆是有一个点触验证码的,不过对软件来说这种验证码已经是最简章的存在了,所以加一个座标点击,就完事了,网站也没有太高的要求,不过发那个博客是五分钟只能发一帖,不然会一直显示发帖太过于频繁,会发不出去的,五分钟一帖,是很折磨的,但软件不会嫌烦,他能自动的切换账号发,可以自动用的缓存登陆发,可以自动动的等分钟发的,完全看您想要方还是圆的,一切都可以调试,没有什么限
群发软件灭提问网自动发提问软件
灭提问网自动发提问软件,这个网站后台会不会有眯怪,不管这么多了,软件可是用来发广告用的,这个网站登录有验证码,发帖也有一个字母的验证码在上面的,所以是要耗钱的,不过这些网站这两年如果找到好的,都是秒收录的存在,比百度自己的产品收录都要好,这是非常神奇的地方,特别是这些提问类的网站,更是牛的不行,边发边秒收,只是每天要发,有一天不发,那收录就全部回到了解放前了,原因可没有人【知】道的事,规律就是这样
群发软件齐鲁信息网站自动发布工具
齐鲁信息网站自动发布工具,这个网站只是一个站群论坛来的,他网站会自动大量地用软件挂 N 多信息,等收录好了就卖账号给别人发布帖子的方式,论坛是比较难做收录的,但一旦能做起来,收录会更好一些,排名也会高,论坛本来就是冲着交流的属性去的,所以百度蛛蜘收录的方式排名也是不一样的,虽然经过了这么多久,但基础框架摆在那里是不可能太多的转变,网站就一个简单的问题验证码,回答对了就可以登陆和发帖,他网站也会有大量
群发软件微软Sway自动生成软件
微软Sway自动生成软件下载, 对于国内来说可能不是很神奇,但在谷歌里可能早已经是大佬级别的存在吧,外国人的东西有很多是很新鲜的玩意儿,但用的人却像是比较高级的,而国内的东西,有一点新鲜的东西就会扎堆在那里玩弄,也不【知】道是价值观的问题,还是因为人的大脑都喜欢没有见过的新鲜玩意儿,这个东东可以生成很多漂亮的新闻稿,像 PPT 类似的。不过外国人这些看上去很多都已经被人工智能给完美替代的主了吧。软件这里是写
群发软件百度文档自动上传 WORD 文件软件
百度文档自动上传 WORD 文件软件,这个网站应该是比较多人弄的,不过弄的都是正规的方式,以前可以弄成审核通过了,放一些外链网址去,可是现在审核通过修改,又要审核了,基本让他堵住了漏洞,不过还是有一些人在上传 WORD 用的,毕竟正规工作的人太多太多需求了,这些文档收录好,还可以赚钱,很多人会贪那点方便下载别人集合好的文档是行调用,特别是一些总结,一些目录,都是别人幸苦劳作的结果,甚至有的是作为小说的宣传地把
群发软件企业录网站分类信息软件
企业录网站分类信息发布软件,这类网站有十年多的历史了吧,还是老网站好,随便发一发就收录,问题是养起这些大胖小子也是不容易的,先前的坚持与无奈,以前可能会觉得是一只吞金兽,现在可是一棵摇钱树了吧,还理啥财,种一棵树最好的时机是十年前,其次是现在,我们努力的规划好了吗,现在人工智能发帖也是这样,找一个 AI 的形象,把自己训练出来,也许可以永生哦,有很多人都是这样想的,把自己所有的思想存到 AI 里,算出来一
群发软件师徒网自动发布提问软件
师徒网自动发布提问软件,这个网站有点像博客,不过他又分出了一个提问版区,所以这里收录会比较好一些,他这个提问区其实是 WP 博客系统弄的,也不【知】道为什么整出这么一个版块出来,他登陆方式,全部都已经美化了,但 WP 博客系统那种选择分类的模型至今没有什么变化,还是老三样,这里发布帖子的时候,他分类是用了固定的方式的,登陆有一个点触验证码,估计是比较简单的鼠标检验,用座标功能点击一下就可以实现自动登陆了。
群发软件大河网B2B软件
大河网全自动群发软件,这个网站是 B2B 网站来的,本来就给您发广告用的,不过他只有发资讯类的,要充多少钱他是可以自动开通的,也算是很方便的一个自助网站了,这类权重比较小的网站,网站主人也是很聪明的,他们会把所有信息发到一个分类,这样可以提高一个分类目标的权重,收录自然会比散弹枪好很多的,只是网站也没有啥快的,很卡屏的感觉吧。不过他这个鬼下拉分类倒是很奇葩,天天会更换,不【知】道要整点啥,所以我这里是
群发软件天天基金头条发布软件
天天基金头条发布软件,天天基金这个可是史上最多有钱人的集散地,网站以前其实是他博客的一个升级版,不过现在头条看上去大气上档次一些吧,也没有太多的限制,只是一个账号一天只能发五帖,首次登陆会有一个点触验证码,不过第二天就会没有,网站是可以缓存登陆的,要是封号了就很完蛋,内容要关于财富之类的内容,不然是会被秒删除的,软件现在是用账号密码登陆,第一次登陆您得手工去输入验证码才让登陆成功,账号密码可以自动
群发软件建设工程网软件群发
建设工程网软件群发,这个网站看上去也是同一批人产品,这类 B2B 网站,如果能收录的,都会出大牛股,如果不能的,那就只能做一个低调的的老百姓了,百度蜘蛛也是一样的得性,看到这类网站开始的时候疯狂追逐,等发现网站内容太过于相似的时候,他又心生讨厌了,只好时不时的远离了,某一天还来给您玩一个空然消失的游戏,让您猜个饱,您是这里生病了,还是那里得病了呢,不过找原因都是徒劳,所有问题都其实出在一个新玩意儿的身
群发软件中国结艺网自动 B2B 网站群发软件
中国结艺网自动 B2B 网站群发软件,这个网站是发布广告的网站,只要有号就可以发,没有验证码,没有审核,有内容和标题都可以导入进去发,其实现在 GPT 这类生成文章,发起来效果会好一些,自己的内容,再加上生成的内容进行发上去,会比插入新闻和小说内容会好一些,只是很多后【知】后觉的人不【知】道怎么生成去用罢了。 结艺网自动 B2B 网站软件下载地址: 随着互联网的普及和电子商务的兴起,B2B(Busin
群发软件当当AdSmart 自动上架货物软件
当当AdSmart 自动上架货物软件, AdSmart依托全球最大中文书店&网上商城当当网,帮助客户进行最有效的市场推广。面向白领,公务员及您可自由选择广告发布类型和目标页面,并可随时修改广告内容和预算。这个软件可以自动批量的上架一些自己的物货,自己只需要输入书本的系列号到软件中去,然后软件会自动按书名,关键字排序,把货物自动把图片,和系列号自动上架上去的一种程序化操作,账号这个分类也是需要自己添加一下的,就是想
群发软件36商务网发布帖子软件
36商务网B2B网站软件,这个网站自然也是 B2B 分类商务网来的,网站是做搜狗搜索的,所以对于这个比较友好一些,只是他们都是 PC 端的,虽然搜狗能秒收,可百度收录也没有多好的效果的,这些网站现在主要是打一个堆量的效果,发的多,收录自然也会上去,发的少的话,自然没有什么好的收录量,不管您发的这种类型网站是大网站或是小网站,没有量一定就是扯皮,没有效果的。只要把量堆下去了,百度蜘蛛多么正人君子,最好也会看在多的
群发软件哔哩哔哩网站专栏群发软件
哔哩哔哩网站自动上传内容图片发布专栏软件,这个网站就是账号比较难求得,一直以来他网站都这种开放模式,收录是现在全网巨好的一份子,现在几乎没有这么开放的网站,有这么高收录量的老大哥,这个脚本可以上传四张图片,其实就是重复的把那几步上传步骤修改一下就可以的,然后分别采集存放到了软件的四个列表,方便插入到内容里,他调用图片必须有一个代码,不然是无法显示图片的,这层里是最麻烦的地方吧,不过专栏不用上传视频
群发软件电梯阁论坛群发工具帖子软件
电梯阁网站全自动发帖子软件下载,电梯阁论坛全自动发帖软件,这个网站看上去会很普通,不过只是一个论坛,但是他是一种技术性论坛,所以秒收录是极高的,特别是他放广告的版块,收录还是比较喜人的,都很多秒收录,看来很多人还是很在乎这些技术性的分享的,虽然现在不正常的人还玩着电脑,正常的人可能早就飞上了哪一个高枝了吧,网站还是这么奇葩的样子,版块多,广告多,收录也居然还被百度蜘蛛给爱上了哈。 电梯阁论坛群发工
群发软件搜狸网站自动发帖软件
搜狸网站自动发帖软件,这个网站是一种注册账号模式发帖的,他和B2B网站类似,但网站没有这么容易即时放开审核。显示中的都是自动审核过的,网站收录的也是搜狗的作用,不过网站是付费形式的,他有会员后台,登陆也会有一个验证码,发帖就一张图片,一个分类,一个标题内容就可以自动发帖成功,没有什么难度的,不过内容这个输入框是嵌套的方式,也就是只能针对他一个网站会有作用,换一个网站这步就得重新做了,好在网站发帖也没
群发软件微页B2B网站发帖软件
微页B2B网站发帖软件,软件市场营销和信息发布时,微页B2B网站发帖软件无疑是一款备受推崇的辅助工具。该软件专为在微页B2B平台进行信息发布与推广而设计,其独特之处在于发帖权限主要面向付费用户开放。这一特性使得微页B2B网站得以有效筛选并确保平台上企业的资质及信息的真实性,从而维护了一个相对纯净且高效率的商业信息发布环境。 微页B2B网站发帖软件下载地址: 发帖过程录像: 微页B2B网站发帖软件作为一项
群发软件图图网文章自动投稿软件
图图网文章自动投稿软件,这个看上去像是一个相册网站,但他其实是一种投稿的网站来的,账号也是付费才会通过审核,并不是免费让您我限发的,网站肯定有点水份才会让您付费,一般这类付费发帖的网站,都可以实现免自己提交蜘蛛池的效果,至于收录结果,完全是看您自己的标题内容的质量说话的,再加上网站的权重高,那收录可能超好,要是没有达到蜘蛛池的要求,那收录就像打水漂似的差劲的,发这类网站,最好的方式是自己复制当天秒
群发软件喜马拉雅自动评论软件
喜马拉雅自动评论软件,这个网站可以发听歌单的,不【知】道为什么大家都不动合,不过今天刚好有人要弄一个评论,他说收录更秒吓人,他是先采集最新的听单,然后采集多少页,再进行听单逐个评论,由于是最新的听单,所以评论都几乎在第一页呈现,如果提交给百度蜘蛛池,很快就秒收录了,这些网站PV非常高,几乎是人气最大的地方,他们拥有的宝藏是值得开发的,如果你的号是VIP号,评论几乎是秒出来,他是利用听单的评论收录,所以
群发软件亿图脑图账号注册个人主页中心页宣传方案
亿图脑图账号注册个人主页中心页宣传方案,这个网站是注册账号进行主页宣传的,这个网站是AI脑图生成的,非常聚人气,所以收录一直很好,他个性签名可以输入标题和内容,内容是二百个字,超过了就输入不了,提交不成功,最好是自己算好字数导入,特别是有一些特殊符号的,这种网站是要跑蜘蛛池的,不跑基本很难收录,不过一旦收录,会一直存在上面,很划算的,排名也很高,不过这个网站也有一个毛病,他要在个人主页里点注册,如果
群发软件17173社区发帖软件
17173社区发帖软件,游戏社区一直是秒收录的地方,像这些大IP超级最多人玩的PV地,肯定都是秒收录的高级地区,这个脚本是自动在剑侠社区发帖的,社区可以自己更换,也可以自己选择分类,不过现在收录最好的就是这么几个社区地了,虽然他是三级域名,但17173的名头还在的,社区里最多人的地方,就是在这里了,社区很多人流的地方,不过这个一个账号发帖会有限制,软件是利用缓存CK进行写入的,没有做登陆步骤,因为他登陆有验证码,
信息发布软件知识辰星网站动态群发软件
知识辰星网站动态群发软件,这个网站和以前的动态微博类似的网站,他是没有太大的区别的,不过他网站一会放开注册发帖,一会又限制,让人摸不着头脑,网站放开的时候就像是洪水一样带来N多的收录,发帖多的人自然知道怎么弄内容可以收录,以不弄弄某些内容不会收录的,如果不明白这点,是极度百万剧的存在,因为你根本就没有吸取前面的经验,只是有盲目从众的干活,是得不出好的结果的,做很多事情既要低头拉车,也要抬头看路,知
群发软件720云网站自动创建场景软件
720云网站自动创建场景软件,这个网站是做全景VR影像类似的,发现他们居然可以把这个链接做为宣传的地方,不过只能五十个字完工,也就是标题这里输入五十个字左右,脚本里做了限制五十个字,太长会被K掉,用的是他的素材库,网站没有什么太大的限制,封号也是看运气的,只是网站不能用缓存登陆,他那个验证码是会动来动云的,传到网站打码会有一点差别的,基本是手工打码一个号就可以一直发,没有什么限制,素材用啥都可以,网站权
群发软件QQ 音乐歌单全自动群发软件
QQ 音乐歌单是一个比较低成本的宣传方式,软件先是通过 QQ 登陆歌单页面,然后往了老面的发标题和简介进行宣传,音乐视频小说站可以说是最容易收录的地方了,比其它的限制还少,现在主力位往往很少关注这些,这也是给广告提供了位置的空缺地带,这个脚本可以采集缓存,然后写入缓存进行账号切换着发,这样是很简单的操作了,有的收录了,连评论都成了权重地,因为这些跑跑蜘蛛池极容易变成一个收录地带圈,这也是因为 腾讯这些默认

QQ|( 京ICP备09078825号 )

本网站信息发布软件,是可以发布论坛,发送信息到各大博客,各大b2b软件自动发布,好不夸张的说:只要手工能发在电脑打开IE能发的网站,用这个宣传软件就可以仿制动作,进行推送发到您想发送的B2B网站或是信息发布平台上,不管是后台,还是前台,都可以进行最方便的广告发布,这个广告发布软件,可以按月购买,还可以试用软件,对网站的验证码也可以完全自动对信息发布,让客户自动找上门,使企业轻松实现b2b发布,这个信息发布软件,均是本站原创正版开发,拥有正版的血统,想要新功能,欢迎提意见给我,一好的分类信息群发软件在手,舍我其谁。QQ896757558

GMT+8, 2024-5-19 08:50 , Processed in 0.384310 second(s), 55 queries .

宣传软件--信息发布软件--b2b软件广告发布软件

快速回复 返回顶部 返回列表