用java或者js实现弱js 正则 密码规则则

javascript中实现兼容JAVA的hashCode算法代码分享
投稿:junjie
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了javascript中实现兼容JAVA的hashCode算法代码分享,实现跟JAVA中的运算结果一致,需要的朋友可以参考下
在java中一个hashCode算法,可以用来计算一个字符串的hash值,今天一个朋友突然问俺能不能在js中计算hashCode,要求和java的hashCode计算结果一样。
对于java的hashCode,以前到现在也一直没有了解过其算法,不过猜想应该也不会太难,于是现在java中写了这段代码进行测试:
运行结果:899755
按下Ctrl键点击hashCode方法名跟进去看了下其算法,发现是很简单的几句代码,如下所示:
public int hashCode() {
if (h == 0) {
char val[] =
for (int i = 0; i & i++) {
h = 31*h + val[off++];
这下好,简单移植过去到js里就应该ok了。于是写出如下JS代码:
&script type="text/javascript"&
function hashCode(str){
&&&&&&&& var h = 0, off = 0;
&&&&&&&& var len = str.
&&&&&&&& for(var i = 0; i & i++){
&&&&&&&&&&&& h = 31 * h + str.charCodeAt(off++);
&&&&&&&& }
&&&& alert(hashCode('沈阳'));
&& &/script&
运行结果:899755
OK,与java计算结果一样。本以为这么就搞定了,然后想着再随便找个串测试下:
“沈阳沈阳啊”,在JAVA中运行结果为:,然而到js中成了:。
狂晕,这随便一试就有问题了!后思考片刻,突然想到Java中int长度好像是21亿左右,js中就没这限制了。问题应该就是在这里了,于是对之前的方法做了一点改造:
function hashCode(str){
&&&&&&&& var h = 0, off = 0;
&&&&&&&& var len = str.
&&&&&&&& for(var i = 0; i & i++){
&&&&&&&&&&&& h = 31 * h + str.charCodeAt(off++);
&&&&&&&& }
&&&& var t=-*2;
&&&& while(h&){
&&&&&& h+=t
alert(hashCode('沈阳沈阳啊'));&/script&
再次测试!OK!大功告成。没有什么技术含量,一点小总结
更新,上面那个效率比较低下,当内容很长的时候会当掉,下面的代码是优化后的代码:
&&& function hashCode(str) {
&&&&&&& var h = 0;
&&&&&&& var len = str.
&&&&&&& var t = ;
&&&&&&& for (var i = 0; i & i++) {
&&&&&&&&&&& h = 31 * h + str.charCodeAt(i);
&&&&&&&&&&& if(h & ) h %=//java int溢出则取模
&&&&&&& /*var t = - * 2;
&&&&&&& while (h & ) {
&&&&&&&&&&& h += t
&&&&&&& }*/
&&& alert(hashCode('C#同一时间N个线程在并发执行,其余在队列中如何实现')); //
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具博客分类:
前几天user有个要求,就是系统中所有的密码输入框的内容(password) 必须加密提交。即使用工具能抓取到request,但是抓取到的password 都是密文。
为此:找了很多解决方案,最终采用的如下
web 前端 javascript RSA加密提交数据,server端用java解密
采用的第三方组件及jar
1.jquery-1.6.js
2.jquery.jcryption-1.1.js
jar files:
3.bcprov-ext-jdk15on-148.jar
4.bcprov-jdk15on-148.jar
第一:当系统在加载页面完成后,如果发现页面中包含密码框,则向server发起请求来获取key--用于js加密。此key要存于session中,以便server解密。
第二:当密码框在输入密码失焦时,调用js加密。在提交的时候,check password是否加密。阻止明文提交。
第三:server在收到请求后,对密文进行解密。
$(function(){
var hasPass = $('input:password');
var token = $('#csrfToken').val();
getKeys();
$(hasPass).each(function(index){
var currentItem = $(this);
$(currentItem).focus(function(){
$(currentItem).val("");
$(currentItem).blur(function(){
var cVal = $(currentItem).val();
if($.trim(cVal) != "" && "undefined" != keys && null != keys){
$.jCryption.encrypt($(currentItem).val(), keys, function(encryptedPasswd) {
$(currentItem).val(encryptedPasswd);
function getKeys() {
$.jCryption.getKeys(URL,function(receivedKeys) {
keys = receivedK
function submitForm(form){
var flag =
//check password is encrypt or not
$(form).find("input:password").each(function(index){
var currPass = $(this);
var value = $.trim($(currPass).val());
var reg = /^[A-Za-z0-9]{128}$/;
if(value == ""){
Cpass = $(currPass);
}else if(!reg.test(value)){
//the reason maybe previous request gain public key failed
//so please check - public key via ajax request.-(getKey(val))
//alert("key--&"+keys);
alert("encrypt failed.");
if(flag == true){
form.submit();
if(undefined != Cpass && null != Cpass && $(Cpass).val() == ""){
alert("Please key in your password.");
$(Cpass).focus();
}else{//redirect to login page
var url = window.location.
//there can do clear form ...
window.location.href = url+"?request=Login";
加密解密工具类
package util.jsRSA
import java.io.UnsupportedEncodingE
import java.net.URLD
import java.security.GeneralSecurityE
import java.security.KeyP
import java.security.KeyPairG
import java.security.NoSuchAlgorithmE
import java.security.interfaces.RSAPublicK
import java.util.HashM
import java.util.M
import javax.crypto.C
public class JCryptionUtil {
public static final java.security.Provider provider = new org.bouncycastle.jce.provider.BouncyCastleProvider();
* Constructor
public JCryptionUtil() throws Exception {
java.security.Security.addProvider(provider);
* Generates the Keypair with the given keyLength.
* @param keyLength
length of key
* @return KeyPair object
* @throws RuntimeException
if the RSA algorithm not supported
public KeyPair generateKeypair(int keyLength) throws Exception {
kpg = KeyPairGenerator.getInstance("RSA");
} catch (Exception e) {
kpg = KeyPairGenerator.getInstance("RSA",provider);
kpg.initialize(keyLength);
KeyPair keyPair = kpg.generateKeyPair();
return keyP
} catch (NoSuchAlgorithmException e1) {
throw new RuntimeException("RSA algorithm not supported", e1);
} catch (Exception e) {
throw new Exception("other exceptions", e);
* Decrypts a given string with the RSA keys
* @param encrypted
full encrypted text
* @param keys
* @return decrypted text
* @throws RuntimeException
if the RSA algorithm not supported or decrypt operation failed
public static String decrypt(String encrypted, KeyPair keys) throws Exception {
dec = Cipher.getInstance("RSA/NONE/NoPadding");
} catch (Exception e) {
dec = Cipher.getInstance("RSA/NONE/NoPadding",provider);
dec.init(Cipher.DECRYPT_MODE, keys.getPrivate());
} catch (GeneralSecurityException e) {
throw new RuntimeException("RSA algorithm not supported", e);
String[] blocks = encrypted.split("\\s");
StringBuffer result = new StringBuffer();
for (int i = blocks.length - 1; i &= 0; i--) {
byte[] data = hexStringToByteArray(blocks[i]);
byte[] decryptedBlock = dec.doFinal(data);
result.append(new String(decryptedBlock));
} catch (GeneralSecurityException e) {
throw new RuntimeException("Decrypt error", e);
* Some code is getting added in first 2 digits with Jcryption need to investigate
return result.reverse().toString().substring(2);
* Parse url string (Todo - better parsing algorithm)
* @param url
value to parse
* @param encoding
encoding value
* @return Map with param name, value pairs
public static Map parse(String url, String encoding) {
String urlToParse = URLDecoder.decode(url, encoding);
String[] params = urlToParse.split("&");
Map parsed = new HashMap();
for (int i = 0; i & params. i++) {
String[] p = params[i].split("=");
String name = p[0];
String value = (p.length == 2) ? p[1] :
parsed.put(name, value);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Unknown encoding.", e);
* Return public RSA key modulus
* @param keyPair
* @return modulus value as hex string
public static String getPublicKeyModulus(KeyPair keyPair) {
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
return publicKey.getModulus().toString(16);
* Return public RSA key exponent
* @param keyPair
* @return public exponent value as hex string
public static String getPublicKeyExponent(KeyPair keyPair) {
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
return publicKey.getPublicExponent().toString(16);
* Max block size with given key length
* @param keyLength
length of key
* @return numeber of digits
public static int getMaxDigits(int keyLength) {
return ((keyLength * 2) / 16) + 3;
* Convert byte array to hex string
* @param bytes
input byte array
* @return Hex string representation
public static String byteArrayToHexString(byte[] bytes) {
StringBuffer result = new StringBuffer();
for (int i = 0; i & bytes. i++) {
result.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16)
.substring(1));
return result.toString();
* Convert hex string to byte array
* @param data
input string data
* @return bytes
public static byte[] hexStringToByteArray(String data) {
int k = 0;
byte[] results = new byte[data.length() / 2];
for (int i = 0; i & data.length();) {
results[k] = (byte) (Character.digit(data.charAt(i++), 16) && 4);
results[k] += (byte) (Character.digit(data.charAt(i++), 16));
* @param args
// public static void main(String[] args) {
JCryptionUtil jCryption = new JCryptionUtil();
System.out.println(jCryption.toPublicKeyString());
public String toPublicKeyString() throws Exception {
KeyPair keys = generateKeypair(512);
StringBuffer out = new StringBuffer();
String e = getPublicKeyExponent(keys);
String n = getPublicKeyModulus(keys);
String md = String.valueOf(getMaxDigits(512));
out.append("{\"e\":\"");
out.append(e);
out.append("\",\"n\":\"");
out.append(n);
out.append("\",\"maxdigits\":\"");
out.append(md);
out.append("\"}");
return out.toString();
生成key的serverlet 代码。很简单。
JCryptionUtil jCryptionUtil = new JCryptionUtil();
KeyPair keys =
keys = jCryptionUtil.generateKeypair(512);
request.getSession().setAttribute("keys", keys);
StringBuffer output = new StringBuffer();
String e = JCryptionUtil.getPublicKeyExponent(keys);
String n = JCryptionUtil.getPublicKeyModulus(keys);
String md = String.valueOf(JCryptionUtil.getMaxDigits(512));
output.append("{\"e\":\"");
output.append(e);
output.append("\",\"n\":\"");
output.append(n);
output.append("\",\"maxdigits\":\"");
output.append(md);
output.append("\"}");
output.toString();
response.getOutputStream().print(output.toString().replaceAll("\r", "").replaceAll("\n", "").trim());
解密的servlet中代码,当然也可在写在filter中
String pass = request.getParameter("pass");//login pass
KeyPair keys = (KeyPair) SessionUtility.getSession(request).getAttribute("keys");
String decryptedPass = JCryptionUtil.decrypt(pass, keys);
request.setAttribute("pass", decryptedPass);
到此,就处理了。
现在我不知道,还有没有更好的解决方法。。。。各位大神多指点哈。。
另外:如果自己project 会部署到其他系统(eg:unix.....etc),如果在获取key失败,检查一下server log。如果有securityPermission的exception的话。
下载次数: 440
下载次数: 315
浏览 27895
KeyPair keys = (KeyPair) SessionUtility.getSession(request).getAttribute("keys");& SessionUtility在哪里?"keys"在哪里?SessionUtility -- 是项目中的工具类,keys 也是自己定义的一个属性名称。这些都是自定义的哈。。
hb_keepmoving
浏览: 169932 次
来自: 成都
&div class=&quote_title ...
这个做法,大概是,用AJAX获得一个秘钥。然后对密码进行加密。 ...
KeyPair keys = (KeyPair) Sessio ...
获取key后的Ajax异步的方法 执行,应该写在 ...
当系统在加载页面完成后,如果发现页面中包含密码框,则向serv ...3144人阅读
JavaScript(11)
在java中对数据进行加密的代码:
public static String MD5Encode(String str) {
MessageDigest messageDigest =
messageDigest = MessageDigest.getInstance(&MD5&);
messageDigest.reset();
messageDigest.update(str.getBytes(&UTF-8&));
} catch (NoSuchAlgorithmException e) {
System.out.println(&NoSuchAlgorithmException caught!&);
System.exit(-1);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
byte[] byteArray = messageDigest.digest();
StringBuffer md5StrBuff = new StringBuffer();
for (int i = 0; i & byteArray. i++) {
if (Integer.toHexString(0xFF & byteArray[i]).length() == 1)
md5StrBuff.append(&0&).append(Integer.toHexString(0xFF & byteArray[i]));
md5StrBuff.append(Integer.toHexString(0xFF & byteArray[i]));
return md5StrBuff.toString();
js中对数据进行加密,首先要引入md5.js,然后对需要加密的数据调用hex_md5(str)即可。
password = hex_md5(password);
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:327253次
积分:3882
积分:3882
排名:第8488名
原创:91篇
转载:25篇
评论:25条
(1)(1)(1)(8)(4)(6)(4)(3)(2)(3)(3)(3)(3)(4)(3)(9)(3)(5)(1)(6)(5)(22)(3)(7)(5)(1)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'今天看啥 热点:
javasript实现密码的隐藏与显示,javasript实现密码javascript实现的查看隐藏的密码框中明文信息的方法,用户输入密码时显示星号,如何查看明文信息呢,用js可以实现查看密码框的明文。
在密码框中输入密码,会以星号来显示,文字内容被自动隐藏了。
用户输入密码时显示星号,如何查看明文信息呢,用js可以实现查看密码框的明文。
&html&&head&&title&密码的隐藏与显示&/title&
&body bgcolor=#fef4d9&&br&&br&
&center&密码的隐藏与显示&/center&&br&
&table bordercolor=#cc0000 border=5 borderlight="green"&
&td align=middle&&div align="center"&效果显示&/div&&/td&
&td align=middle&
&form name=forms action="" method=post&&span id=box&
&input type=password value=523654 name=password&&/span& &span id=click&&a href="javascript:ps()"&显示密码&/a&&/span&
&script language=javascript&
function ps(){
if (this.forms.password.type="password")
box.innerhtml="&input type="html" name="password" size="20" value="+this.forms.password.value+"&";
click.innerhtml="&a href="javascript:txt()"&隐藏密码&/a&"}
function txt(){
if (this.forms.password.type="text")
box.innerhtml="&input type="password" name="password" size="20" value="+this.forms.password.value+"&";
click.innerhtml="&a href="javascript:ps()"&显示密码&/a&"}
&/form&&/td&&/tr&&/tbody&&/table&&/center&
以上所述就是本文的全部内容,有需要的小伙伴可以参考下。
相关搜索:
相关阅读:
相关频道:
&&&&&&&&&&&&&&&&&&
Javascript最近更新

我要回帖

更多关于 js 密码强弱 的文章

 

随机推荐