「javabs加密」java简单加密

博主:adminadmin 2023-03-21 08:28:05 469

今天给各位分享javabs加密的知识,其中也会对java简单加密进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java的sha1加密和object-c的sha1加密后的值不一样,谁能帮我解决一下。多谢了

结果是一样的, 但是你多搞了一点: java你是用Base64编码成字符串, 而ObjC你是直接用16进制输出的, 你java上不Base64编码, 也输出成16进制, 就一样了;

可变MD5加密(Java实现)

可变在这里含义很简单 就是最终的加密结果是可变的 而非必需按标准MD 加密实现 Java类库security中的MessageDigest类就提供了MD 加密的支持 实现起来非常方便 为了实现更多效果 我们可以如下设计MD 工具类

Java代码

package ** ** util;

import java security MessageDigest;

/**

* 标准MD 加密方法 使用java类库的security包的MessageDigest类处理

* @author Sarin

*/

public class MD {

/**

* 获得MD 加密密码的方法

*/

public static String getMD ofStr(String origString) {

String origMD = null;

try {

MessageDigest md = MessageDigest getInstance( MD );

byte[] result = md digest(origString getBytes());

origMD = byteArray HexStr(result);

} catch (Exception e) {

e printStackTrace();

}

return origMD ;

}

/**

* 处理字节数组得到MD 密码的方法

*/

private static String byteArray HexStr(byte[] bs) {

StringBuffer *** = new StringBuffer();

for (byte b : bs) {

*** append(byte HexStr(b));

}

return *** toString();

}

/**

* 字节标准移位转十六进制方法

*/

private static String byte HexStr(byte b) {

String hexStr = null;

int n = b;

if (n ) {

//若需要自定义加密 请修改这个移位算法即可

n = b x F + ;

}

hexStr = Integer toHexString(n / ) + Integer toHexString(n % );

return hexStr toUpperCase();

}

/**

* 提供一个MD 多次加密方法

*/

public static String getMD ofStr(String origString int times) {

String md = getMD ofStr(origString);

for (int i = ; i times ; i++) {

md = getMD ofStr(md );

}

return getMD ofStr(md );

}

/**

* 密码验证方法

*/

public static boolean verifyPassword(String inputStr String MD Code) {

return getMD ofStr(inputStr) equals(MD Code);

}

/**

* 重载一个多次加密时的密码验证方法

*/

public static boolean verifyPassword(String inputStr String MD Code int times) {

return getMD ofStr(inputStr times) equals(MD Code);

}

/**

* 提供一个测试的主函数

*/

public static void main(String[] args) {

System out println( : + getMD ofStr( ));

System out println( : + getMD ofStr( ));

System out println( sarin: + getMD ofStr( sarin ));

System out println( : + getMD ofStr( ));

}

}

可以看出实现的过程非常简单 因为由java类库提供了处理支持 但是要清楚的是这种方式产生的密码不是标准的MD 码 它需要进行移位处理才能得到标准MD 码 这个程序的关键之处也在这了 怎么可变?调整移位算法不就可变了么!不进行移位 也能够得到 位的密码 这就不是标准加密了 只要加密和验证过程使用相同的算法就可以了

MD 加密还是很安全的 像CMD 那些穷举破解的只是针对标准MD 加密的结果进行的 如果自定义移位算法后 它还有效么?可以说是无解的了 所以MD 非常安全可靠

为了更可变 还提供了多次加密的方法 可以在MD 基础之上继续MD 就是对 位的第一次加密结果再MD 恩 这样去破解?没有任何意义

这样在MIS系统中使用 安全可靠 欢迎交流 希望对使用者有用

我们最后看看由MD 加密算法实现的类 那是非常庞大的

Java代码

import java lang reflect *;

/**

* **********************************************

* md 类实现了RSA Data Security Inc 在提交给IETF

* 的RFC 中的MD message digest 算法

* ***********************************************

*/

public class MD {

/* 下面这些S S 实际上是一个 * 的矩阵 在原始的C实现中是用#define 实现的

这里把它们实现成为static final是表示了只读 切能在同一个进程空间内的多个

Instance间共享*/

static final int S = ;

static final int S = ;

static final int S = ;

static final int S = ;

static final int S = ;

static final int S = ;

static final int S = ;

static final int S = ;

static final int S = ;

static final int S = ;

static final int S = ;

static final int S = ;

static final int S = ;

static final int S = ;

static final int S = ;

static final int S = ;

static final byte[] PADDING = {

};

/* 下面的三个成员是MD 计算过程中用到的 个核心数据 在原始的C实现中

被定义到MD _CTX结构中

*/

private long[] state = new long[ ]; // state (ABCD)

private long[] count = new long[ ]; // number of bits modulo ^ (l *** first)

private byte[] buffer = new byte[ ]; // input buffer

/* digestHexStr是MD 的唯一一个公共成员 是最新一次计算结果的

进制ASCII表示

*/

public String digestHexStr;

/* digest 是最新一次计算结果的 进制内部表示 表示 bit的MD 值

*/

private byte[] digest = new byte[ ];

/*

getMD ofStr是类MD 最主要的公共方法 入口参数是你想要进行MD 变换的字符串

返回的是变换完的结果 这个结果是从公共成员digestHexStr取得的.

*/

public String getMD ofStr(String inbuf) {

md Init();

md Update(inbuf getBytes() inbuf length());

md Final();

digestHexStr = ;

for (int i = ; i ; i++) {

digestHexStr += byteHEX(digest[i]);

}

return digestHexStr;

}

// 这是MD 这个类的标准构造函数 JavaBean要求有一个public的并且没有参数的构造函数

public MD () {

md Init();

return;

}

/* md Init是一个初始化函数 初始化核心变量 装入标准的幻数 */

private void md Init() {

count[ ] = L;

count[ ] = L;

///* Load magic initialization constants

state[ ] = x L;

state[ ] = xefcdab L;

state[ ] = x badcfeL;

state[ ] = x L;

return;

}

/* F G H I 是 个基本的MD 函数 在原始的MD 的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 and

Rotation is separate from addition to prevent reputation

*/

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 ( 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 ( 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 ( 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 ( s));

a += b;

return a;

}

/*

md Update是MD 的主计算过程 inbuf是要变换的字节串 inputlen是长度 这个

函数由getMD ofStr调用 调用之前需要调用md init 因此把它设计成private的

*/

private void md Update(byte[] inbuf int inputLen) {

int i index partLen;

byte[] block = new byte[ ];

index = (int) (count[ ] ) x F;

// /* Update number of bits */

if ((count[ ] += (inputLen )) (inputLen ))

count[ ]++;

count[ ] += (inputLen );

partLen = index;

// Transform as many times as possible

if (inputLen = partLen) {

md Memcpy(buffer inbuf index partLen);

md Transform(buffer);

for (i = partLen; i + inputLen; i += ) {

md Memcpy(block inbuf i );

md Transform(block);

}

index = ;

} else

i = ;

///* Buffer remaining input */

md Memcpy(buffer inbuf index i inputLen i);

}

/*

md Final整理和填写输出结果

*/

private void md Final() {

byte[] bits = new byte[ ];

int index padLen;

///* Save number of bits */

Encode(bits count );

///* Pad out to mod

index = (int) (count[ ] ) x f;

padLen = (index ) ? ( index) : ( index);

md Update(PADDING padLen);

///* Append length (before padding) */

md Update(bits );

///* Store state in digest */

Encode(digest state );

}

/* md Memcpy是一个内部使用的byte数组的块拷贝函数 从input的inpos开始把len长度的

字节拷贝到output的outpos位置开始

*/

private void md Memcpy(byte[] output byte[] input int outpos int inpos int len) {

int i;

for (i = ; i len; i++)

output[outpos + i] = input[inpos + i];

}

/*

md Transform是MD 核心变换程序 有md Update调用 block是分块的原始字节

*/

private void md Transform(byte block[]) {

long a = state[ ] b = state[ ] c = state[ ] d = state[ ];

long[] x = new long[ ];

Decode(x block );

/* Round */

a = FF(a b c d x[ ] S xd aa L); /* */

d = FF(d a b c x[ ] S xe c b L); /* */

c = FF(c d a b x[ ] S x dbL); /* */

b = FF(b c d a x[ ] S xc bdceeeL); /* */

a = FF(a b c d x[ ] S xf c fafL); /* */

d = FF(d a b c x[ ] S x c aL); /* */

c = FF(c d a b x[ ] S xa L); /* */

b = FF(b c d a x[ ] S xfd L); /* */

a = FF(a b c d x[ ] S x d L); /* */

d = FF(d a b c x[ ] S x b f afL); /* */

c = FF(c d a b x[ ] S xffff bb L); /* */

b = FF(b c d a x[ ] S x cd beL); /* */

a = FF(a b c d x[ ] S x b L); /* */

d = FF(d a b c x[ ] S xfd L); /* */

c = FF(c d a b x[ ] S xa eL); /* */

b = FF(b c d a x[ ] S x b L); /* */

/* Round */

a = GG(a b c d x[ ] S xf e L); /* */

d = GG(d a b c x[ ] S xc b L); /* */

c = GG(c d a b x[ ] S x e a L); /* */

b = GG(b c d a x[ ] S xe b c aaL); /* */

a = GG(a b c d x[ ] S xd f dL); /* */

d = GG(d a b c x[ ] S x L); /* */

c = GG(c d a b x[ ] S xd a e L); /* */

b = GG(b c d a x[ ] S xe d fbc L); /* */

a = GG(a b c d x[ ] S x e cde L); /* */

d = GG(d a b c x[ ] S xc d L); /* */

c = GG(c d a b x[ ] S xf d d L); /* */

b = GG(b c d a x[ ] S x a edL); /* */

a = GG(a b c d x[ ] S xa e e L); /* */

d = GG(d a b c x[ ] S xfcefa f L); /* */

c = GG(c d a b x[ ] S x f d L); /* */

b = GG(b c d a x[ ] S x d a c aL); /* */

/* Round */

a = HH(a b c d x[ ] S xfffa L); /* */

d = HH(d a b c x[ ] S x f L); /* */

c = HH(c d a b x[ ] S x d d L); /* */

b = HH(b c d a x[ ] S xfde cL); /* */

a = HH(a b c d x[ ] S xa beea L); /* */

d = HH(d a b c x[ ] S x bdecfa L); /* */

c = HH(c d a b x[ ] S xf bb b L); /* */

b = HH(b c d a x[ ] S xbebfbc L); /* */

a = HH(a b c d x[ ] S x b ec L); /* */

d = HH(d a b c x[ ] S xeaa faL); /* */

c = HH(c d a b x[ ] S xd ef L); /* */

b = HH(b c d a x[ ] S x d L); /* */

a = HH(a b c d x[ ] S xd d d L); /* */

d = HH(d a b c x[ ] S xe db e L); /* */

c = HH(c d a b x[ ] S x fa cf L); /* */

b = HH(b c d a x[ ] S xc ac L); /* */

/* Round */

a = II(a b c d x[ ] S xf L); /* */

d = II(d a b c x[ ] S x aff L); /* */

c = II(c d a b x[ ] S xab a L); /* */

b = II(b c d a x[ ] S xfc a L); /* */

a = II(a b c d x[ ] S x b c L); /* */

d = II(d a b c x[ ] S x f ccc L); /* */

c = II(c d a b x[ ] S xffeff dL); /* */

b = II(b c d a x[ ] S x dd L); /* */

a = II(a b c d x[ ] S x fa e fL); /* */

d = II(d a b c x[ ] S xfe ce e L); /* */

c = II(c d a b x[ ] S xa L); /* */

b = II(b c d a x[ ] S x e a L); /* */

a = II(a b c d x[ ] S xf e L); /* */

d = II(d a b c x[ ] S xbd af L); /* */

c = II(c d a b x[ ] S x ad d bbL); /* */

b = II(b c d a x[ ] S xeb d L); /* */

state[ ] += a;

state[ ] += b;

state[ ] += c;

state[ ] += d;

}

/*Encode把long数组按顺序拆成byte数组 因为java的long类型是 bit的

只拆低 bit 以适应原始C实现的用途

*/

private void Encode(byte[] output long[] input int len) {

int i j;

for (i = j = ; j len; i++ j += ) {

output[j] = (byte) (input[i] xffL);

output[j + ] = (byte) ((input[i] ) xffL);

output[j + ] = (byte) ((input[i] ) xffL);

output[j + ] = (byte) ((input[i] ) xffL);

}

}

/*Decode把byte数组按顺序合成成long数组 因为java的long类型是 bit的

只合成低 bit 高 bit清零 以适应原始C实现的用途

*/

private void Decode(long[] output byte[] input int len) {

int i j;

for (i = j = ; j len; i++ j += )

output[i] = b iu(input[j]) | (b iu(input[j + ]) ) | (b iu(input[j + ]) )

| (b iu(input[j + ]) );

return;

}

/*

b iu是我写的一个把byte按照不考虑正负号的原则的"升位"程序 因为java没有unsigned运算

*/

public static long b iu(byte b) {

return b ? b x F + : b;

}

/*byteHEX() 用来把一个byte类型的数转换成十六进制的ASCII表示

因为java中的byte的toString无法实现这一点 我们又没有C语言中的

sprintf(outbuf % X ib)

*/

public static String byteHEX(byte ib) {

char[] Digit = { A B C D E F };

char[] ob = new char[ ];

ob[ ] = Digit[(ib ) X F];

ob[ ] = Digit[ib X F];

String s = new String(ob);

return s;

}

public static void main(String args[]) {

MD m = new MD ();

if (Array getLength(args) == ) { //如果没有参数 执行标准的Test Suite

System out println( MD Test suite: );

System out println( MD (\ \ ): + m getMD ofStr( ));

System out println( MD (\ a\ ): + m getMD ofStr( a ));

System out println( MD (\ abc\ ): + m getMD ofStr( abc ));

System out println( MD (\ \ ): + m getMD ofStr( ));

System out println( MD (\ \ ): + m getMD ofStr( ));

System out println( MD (\ message digest\ ): + m getMD ofStr( message digest ));

System out println( MD (\ abcdefghijklmnopqrstuvwxyz\ ): + m getMD ofStr( abcdefghijklmnopqrstuvwxyz ));

System out println( MD (\ ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz \ ):

+ m getMD ofStr( ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ));

} else

System out println( MD ( + args[ ] + )= + m getMD ofStr(args[ ]));

}

lishixinzhi/Article/program/Java/hx/201311/26604

Java B/S模式

在Java B/S开发模式有以下几种:

一、JSP+JDBC

这是最简单的一种开发模式是页面+逻辑处理,映射到技术上反应出来的有Jsp+Jdbc,在基于这类的实现中在View层也就是jsp页面上负责数据的显示、逻辑处理,结合jdbc完成数据的持久化,在小型的项目中,人们确实发现这种方式是最为方便的,但在复杂的项目以及需求不断变化的项目中,人们慢慢的发现这种方式造成了不少的问题,首先是调试的问题,想想在一个jsp页面中进行排错是多么的困难,其次是修改的问题,为了满足用户需求的一个小小的变化,都需要去改不少的页面,而且很多时候由于写的时间长了,自己都需要回忆很久才能想起是怎么回事,更不用说如果人员流动了会怎么样,同时还带来开发效率的问题,由于需要缺少足够的调试的支持,需要较为熟练的开发人员才能快速的完成,对于一般的人员来说需要一定的适应和学习过程,当然伴随而来的还有诸如修改界面的时候一不小心少copy了点代码什么造成的错,最大的问题可能还是重用的问题,通常会造成N多同样的代码在页面上copy来copy去的,总结下来在这种模式下有几个比较重大的问题就是:

1、调试问题。

2、维护问题,显示和逻辑处理在一起导致了修改显示的时候较为困难,至于修改代码则因为之前的调试问题导致了困难,同时由于逻辑均在页面上后期接手人员需要一段时间去理解。

3、代码重用性问题。

但同样它还是存在优点的,那就是可以很快的上手,但由于调试和维护性问题确实太大了,所以在现在也是基本不再采用这种方式了。

二、JSP+JavaBean

在经历了jsp+jdbc阶段后,开始考虑怎么样去解决上面三个问题,这个时候就诞生了诸JSP+JavaBean这样的技术体系,在这个体系中由jsp页面负责显示以及接收页面请求,并调用相应的JavaBean来完成逻辑处理,在获取其返回的处理数据后转到相应的页面进行显示。在这样的技术体系中,由于逻辑是由JavaBean来完成的,可以对其进行调试了,代码的重用性一定程度上也得到了提高。刚开始的时候用这样的技术体系确实发现比以前用jsp+jdbc爽了很多,但随着用多了,慢慢又发现了问题,那就是在页面中需要编写对于页面请求数据的获取,还得根据请求去调用相应的javabean,并根据javabean的处理结果转入相应的页面,这同样造成了修改的麻烦,毕竟是去页面上修改这些逻辑,总结下来在这种Java B/S开发模式下有比较重大的问题就是:

1、代码重用性以及维护性问题。但这里的代码重用性问题和jsp+jdbc的就不同,在逻辑处理部分现在已经可以重用了,但现在在各个页面就不得不重复的写获取页面请求的参数、相应的调用Model、根据Model的处理结果转发页面,这样的话就导致了在改的时候需要到处去找,造成了维护的复杂。

2、系统结构不清晰。毕竟仍然是在页面控制整个响应页面事件的处理流程,这个时候就造成了很多页面中出现完全相同的jsp代码,而且控制代码在页面,仍然是不便操作,例如对于JavaBean的调用等,而且由于获取javabean的数据需要转发的缘故,其实通常就是在最终的显示页面上加上上面的控制事件处理流程的代码,并没有真正的做到显示和处理的分离。

同样,它的优点在于分离了显示和业务逻辑处理,增强了可调试以及维护性,而且也是很容易上手的,对于小型项目来说仍然是可选的方案之一。

三、基于MVC Framework

在经历了上面的Jsp+JavaBean的Java B/S开发模式后,我们发现其实现在最需要的就是在jsp、javabean之间能有个东西自动完成页面请求数据的封装、根据请求调用相应的javabean、同时根据javabean的处理结果返回至相应的View,有了这样的思想后,发现smalltalk中的MVC思想很适合这种场景,于是便在Java B/S开发中引入了MVC思想,在这里也简单的介绍下MVC思想,MVC强调View和Model的分离,View所面对的是Controller,由Controller负责与Model进行交互,View只负责显示页面以及显示逻辑的处理,显示逻辑指的是诸如第一行要显示蓝色、第二行要显示红色这样的显示方面的处理,Controller负责接受页面请求,并将其请求数据进行封装,同时根据请求调用相应的Model进行逻辑处理,在Model处理后返回结果数据到Controller,Controller将根据此数据调用相应的View,并将此数据传递给View,由View负责将数据进行融合并最终展现。MVC带来的优点很明显的体现出来了,基于一个这样的MVC Framework的话开发人员可以按照一种固定的模式进行开发,规范了整个开发过程,提高了质量以及系统结构的清晰性,并由于保证了View/Model的分离,使得一个Model可以对于多种显示形式的View,需要的仅仅是去改变View和Controller。

按照MVC思想,最容易想到的实现方案莫过于jsp+servlet+javabean,在这里面jsp对应着View,servlet对应着Controller,javabean对应着Model,因为采用servlet可使用servlet container已经封装好的页面数据请求对象HttpServletRequest,这样就省去了自己封装页面请求数据的工作,作为Controller同时还需要承担根据请求调用对应的javabean,最简单的做法无非就是在Servlet中直接根据某种逻辑(诸如反射或接口)调用相应的bean进行执行,之后将HttpServletRequest、HttpServletResponse作为参数传入javabean进行处理,javabean从HttpServletRequest中获取请求数据,将返回的结果数据放入HttpServletResponse,整个过程结束后继续由Controller接手进行处理,这个时候作为Controller的servlet将根据处理的结果返回相应的页面,在这个模型使用时人们慢慢的发现了一个问题,那就是随着jsp、javabean的变化造成了controller的不断修改,需要修改其中调用相应javabean以及转发相应页面的部分,为了解决这个问题,首先想到的是应该分离根据请求调用相应javabean的步骤,这个时候采用了设计模式中的front controller+application controller的方法,front controller负责接受页面请求并进行封装,同时将此数据对象传递至application controller,由application controller来负责调用相应的bean,这样的设计其实都是遵循着一个设计原则,就是职责单一,通常实现application controller的模式是Command模式,在这种情况下MVC Framework的结构体系就演变成了view+controller(front+application)+model。

在完成了上述演变后慢慢又发现了一个问题,就是model依赖于了httpservletrequest,这样造成的一个问题就是没法测试,仍然要不断重启服务器来测试,当然与此同时的发展是model层的细化,细化成用于响应页面请求的action Layer+Domain Model Layer+Persistent Layer,在这里不去讨论后面层次的问题,因为作为MVC Framework它并不管你Model层是怎么个处理流程的。

慢慢也发现了另外一个问题,那就是变化经常要影响到controller的修改,于是便引入了采用配置文件的解决方法,编写action的配置文件,在配置文件中控制根据action的返回结果转入相应的View,这样的话在将来需要改变的时候只需要去改变这个配置文件就可以了,保证了Controller的稳定,这是典型的设计中的重点考虑因素,分离变化和不变化的,让变化造成的影响最小。

但在引入了上面的配置文件后,慢慢又发现了问题,那就是手写配置文件总是容易出各种各样的问题,这个时候采用图形化的界面来生成配置文件的想法又有了,这也就造就了page flow的诞生,当然,这只是page flow的一小部分功能。

当然,随着MVC的发展,也带动了其他相关技术的发展,如异步请求/响应模式(ajax、amowa)等。

javabs加密的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java简单加密、javabs加密的信息别忘了在本站进行查找喔。