js可以使用ocx加密js密码加密解密怎么实现解密

14:49 提问
如何实现js代码MD5加密,传到后台C#中再解密
如何实现js代码对一个字符串进行MD5加密,传到后台C#中再解密成js加密前的字符串
按赞数排序
MD5不是加密算法,它是Hash算法,所以它不可逆,也没法还原成原文。
你可以用base64、异或或者aes des等加密算法去实现。
js加密没用意义,看你代码反转一下就好了~
js加密完全没有用的,别人都能看到你的代码,还破解不了吗。
如果是就解决乱码问题,或者转换url,可以使用js的decode和encode编码。
js加解密太容易反向结果出来。
如何实现js代码对一个字符串进行MD5加密,传到后台C#中再解密成js加密前的字符串
用MD5加密后是无法再解密成原来的字符串的,是不可逆的
可以考虑自己写个加解密算法或者用Des
搜索现成的md5.js
MD5加密是不可逆的。
其他相关推荐问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
我们公司做的网站有大量客户的电话号码(类似百姓网), 后端是nodejs
为了防止采集器和其他非法盗取这些信息, 我想把电话号码改成ajax获取, 并在网站后端加密电话号码然后传到前端, 前端自行解密后再显示
本人对加密算法没什么了解, 搜了一下好像有AES等比较著名的算法
请问是否有符合我的需求的算法? 安全性如何, 是否有足够高的破解成本? 使用时需要哪些细节?
这个问题已被关闭,原因:
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
打码平台(人工打码)的报价我看了一下是3分钱1个。不高吧。——补充:这里指的是打满11位电话号码,破解“用图像展示电话号码”的价格。如果是破一般的4位验证码,更加便宜(接近1分5),甚至部分简单的验证码都不用人工去打,打码平台用机器就能秒出。
浏览器人可以操作,电脑就可以自动化操作。只要展示出来,哪怕是图像,也必然不可避免的被破解。
虽然直接防守不行,但总有变通的办法。你总可以不展示出来,然后增加输入验证码(或其他工作量证明(Proof of Work)步骤)才显示电话号的一步操作。这样可以通过增加人工介入的步骤来制造障碍。只要工作量证明的方法足够花哨多变(例如:请选择以下四个文字哪个是猫叫“喵汪嗷啊”),破解就必须花大的人力投入实际的人工。
总之想彻底达到题主原来的目的,还是难。我想题主需要思考的是鉴权而不是反采集。对于网站而言,重要的是用户不明示公开的信息不泄露,而不是限制用户想公开的信息不被“采集”——从另一个角度来讲,如果只是大量独立的访客正当访问网站,宏观上看是不是也和网站被“采集”差不多呢?
另外也可以加入访问限制,做一个简单(但不彻底)的加强。例如同一cookie/同一ID每天限制查看XX个电话号码,同一邮箱注册一次,或注册必须用手机确认验证码。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
……破解成本足够小,只要你有在客户端展示直接下发了文本,破解成本都很小的。
与其这样做,还不如把电话号码做成图片发下来。
虽然对于破解来说,也就是简单的文字识别(你总不可能把这些文字做的多花是吧),但是至少“稍微”的增加了“一点点”成本。
再恶心一点,下发下来的图片中间是糊的,要复制(查看)完整的号码,请输入验证码,验证码够变态的话这个成本还是会比较高的。
有多高呢?
你可以搜索一下 验证码打码
问题被关闭了,我就把我刚才在评论里面写的放在这里吧,希望你能够看到,至于最后你选用什么方法……按照广泛的实践来看,对尝试多次的用户要求验证码是最靠谱的。
首先,下次请写清楚你的需求,如果按照你原来的问题,我只能说:防采集不需要后端加密,这里所有人已经和你解释了。任何形式的加密也不会提高一毛钱的采集成本。这不是可不可能的问题或者有没有这样的算法。为什么会这样呢? 因为,这就好象你在问:你能给出一个用螺丝刀锤钉子的方案吗?
当然是可以的……但是这么做的要么就是忘记造锤子,要么就是不是?
顺便一说,其实算法还是是有的,如果你一定要求一些算法上的事情的话。
可以用hash(电话号码 + salt),对你的下发的号码加密,只下发hash值和salt(如果要减少等待时间,就也下发几位号码),然后在客户端用js 暴力 破解出电话号码(8位)。
加盐是为了防止打表,这样每解密一个电话号码至少要消耗数分钟甚至数十分钟(视机器配置不同而不同)的时间,对你的用户来说也是这样的,你可以选择少加密几位号码,来减少这个时间,把它降低到几十秒。
这算是最“硬”的防采集方法了,相比起给一个token然后延迟多长时间。或者打一个验证码之类的做法,这样可以100%的消耗掉采集者的CPU时间。
但是你会发现不管怎么做,你的用户的体验,和采集者的体验,是一样的。
而采集者远比用户有耐心多了,他可以把采集程序一挂,然后就去睡大觉,对采集程序来说这比验证码还爽,毕竟只要消耗的电费能值上采集下来的数据所能买出的钱就可以了。
而对于用户,则要像个傻叉一样苦等,这就是为什么,这里所有人都建议你通过各种类型的验证码之类的东西,来检验请求资源的,到底是人类还是机器。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
用一个随机数来标记一个页面。
随机数存在cache里,cache的key用md5或者其他加密算法加密一下。
发送ajax请求获取电话号码的时候,服务端判断这个随机数是否使用过,
没使用过,就返回结果,并标记为使用过。
前端js什么都不用做。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
没有你需要的解决方案, 按你的想法来, 破解的成本很低, 只要是客户端展示过你的解密脚本, 那么第三方就能通过阅读你的javascript源码去自己写相应的解密程序。从这点来看, 主流信息网站所使用的号码生成图片显示是一个初级解决办法,问题在于即便生成图片也不能像验证码那样制作各种干扰否则影响阅读,但是如果按格式生成,第三方会通过ocr去直接转换成文本入库。
我建议你不要直接显示号码, 而是自己制作个验证码去掩护真实号码。
点击《显示号码》按钮的同时,弹出四字成语,用户点选成功才显示。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
建议你生成图片。
这个问题已经被关闭无法回答
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:JS实现OCX控件的事件响应示例
投稿:whsnow
字体:[ ] 类型:转载 时间:
JS支持OCX控件的事件(event),当OCX控件定义的事件发生时,JS可以捕获该事件并对事件进行相应的处理
JS支持OCX控件的事件(event),当OCX控件定义的事件发生时,JS可以捕获该事件并对事件进行相应的处理。
个人理解,其实就是事件的响应由谁来完成,OCX控件自身肯定是可以实现的,JS提供的这种机制使JS也可以完成OCX控件事件的响应。
简单举例如下:
首先在OCX控件中添加自定义事件(预定义事件同理,如鼠标点击等,没亲自试,感觉原理应该是一样的),
事件应该是属于窗口的,所以在Ctrl类上单击右键,Add-&Add Event,如下图:
在打开的对话框中输入事件名称,例如OnChange,如果需要参数,设置参数信息,点击 [ 完成 ],向导自动生成代码,如下
// 事件映射
BEGIN_EVENT_MAP(CH_OcxCtrl, COleControl)
EVENT_CUSTOM_ID("OnChange", eventidChange, OnChange, VTS_NONE)
END_EVENT_MAP()
好了,事件定义完成,接下来需要触发该事件,可在OCX控件的某个函数中调用OnChange()来触发事件。
OCX控件的事件定义至此完成。
接下来是JS中的对事件的响应,代码如下,
&script language="javascript" for="MyCtrl" event="OnChange()" type="text/javascript"&
Call(); //也可直接写操作代码
MyCtrl是该控件在本页面中的OCX控件对象ID(name好像也可以,没有试过),可在javascript中操作该对象。
OnChange()是OCX控件中的事件,这里的事件名称必须与OCX控件中的事件名称一样。
如果事件带参数,当触发事件的时候,OCX控件会传递相应的参数,例如事件有两个参数p1和p2,可写为event = “OnChange(param1,param2)”,此时param1、param2会对应接收到p1、p2,同理Call(param1,param2)。
&script type="text/javascript" Language=Javascript&
function Call(param1,param2)
alert(param1+param2); //操作代码
写的仓促,语言表达不是很清晰,基本思路是这样,用以备忘。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具JS实现密码加密
  在页面中引入base64.js文件,调用方法为:
&!DOCTYPE HTML&
&meta charset=&utf-8&&
&title&base64加密&/title&
&script type=&text/javascript& src=&base64.js&&&/script&
&script type=&text/javascript&&&
&&&&&&& var b = new Base64();&
&&&&&&& var str = b.encode(&admin:admin&);&
&&&&&&& alert(&base64 encode:& + str);&
     //解密
&&&&&&& str = b.decode(str);&
&&&&&&& alert(&base64 decode:& + str);&
&/script&&
2、md5加密
  在页面中引用md5.js文件,调用方法为
&!DOCTYPE HTML&
&meta charset=&utf-8&&
&title&md5加密&/title&
&script type=&text/ecmascript& src=&md5.js&&&/script&
&script type=&text/javascript&&&
& var hash = hex_md5(&123dafd&);
&&& alert(hash)
&/script&&
3、sha1加密
  据说这是最安全的加密
  页面中引入sha1.js,调用方法为
&!DOCTYPE HTML&
&meta charset=&utf-8&&
&title&sha1加密&/title&
&script type=&text/ecmascript& src=&sha1.js&&&/script&
&script type=&text/javascript&&
& var sha = hex_sha1('mima;)
&&& alert(sha)&&
&/script&&
摘自 沫鱼的前端世界1. 加密解密
1.1 前端js加密概述
对系统安全性要求比较高,那么需要选择https协议来传输数据。当然很多情况下一般的web网站,如果安全要求不是很高的话,用http协议就可以了。在这种情况下,密码的明文传输显然是不合适的,因为如果请求在传输过程中被截了,就可以直接拿明文密码登录网站了。&HTTPS(443)在HTTP(80)的基础上加入了SSL(Secure Sockets Layer 安全套接层)协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。传输前用公钥加密,服务器端用私钥解密。
对于使用http协议的web前端的加密,只能防君子不能防小人。前端是完全暴露的,包括你的加密算法。&知道了加密算法,密码都是可以破解的,只是时间问题。请看知乎上的一篇文章:
所以加密是为了增加破解的时间成本,如果破解需要花费的时间让人难以接受,这也就达到了目的。
而为了保证数据库中存储的密码更安全,则需要在后端用多种单向(非对称)加密手段混合进行加密存储。
前端加密后端又需要解密,所以需要对称加密算法,即前端使用 encrypted = encrypt(password+key),后端使用 password = decrypt(encrypted +key) ,前端只传输密码与key加密后的字符串encrypted ,这样即使请求被拦截了,也知道了加密算法,但是由于缺少key所以很难破解出明文密码。所以这个key很关键。而这个key是由后端控制生成与销毁的,用完即失效,所以即使可以模拟用加密后的密码来发请求模拟登录,但是key已经失效了,后端还是验证不过的。
注意,如果本地环境本就是不安全的,key被知道了,那就瞬间就可以用解密算法破解出密码了。这里只是假设传输的过程中被截获的情形。所以前端加密是防不了小人的。如果真要防,可以将加密算法的js文件进行压缩加密,不断更新的手段来使js文件难以获取,让黑客难以获取加密算法。变态的google就是这么干的,自己实现一个js虚拟机,通过不断更新加密混淆js文件让加密算法难以获取。这样黑客不知道加密算法就无法破解了。
常用的对称加密算法有DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfis。可以参考:
这里采用js端与java端互通的AES加密算法。
1.2 前后端加密解密
1.2.1 引用的js加密库
1.2.2 js加密解密
var data = "888888";
= CryptoJS.enc.Utf8.parse(data);
= CryptoJS.enc.Utf8.parse('o7H8uIM2O5qv65l2');
这里key是页面加载的时候由服务器端生成的,用隐藏域保存。
1.2.3 Java端加密解密(PKCS5Padding与js的Pkcs7一致)
package com.jykj.demo.
import javax.crypto.C
import javax.crypto.KeyG
import javax.crypto.spec.SecretKeyS
import mons.codec.binary.Base64;
import sun.misc.BASE64D
public class EncryptUtil {
private static final String KEY = "abcdefgabcdefg12";
private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";
public static String base64Encode(byte[] bytes){
return Base64.encodeBase64String(bytes);
public static byte[] base64Decode(String base64Code) throws Exception{
return new BASE64Decoder().decodeBuffer(base64Code);
public static byte[] aesEncryptToBytes(String content, String encryptKey) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));
return cipher.doFinal(content.getBytes("utf-8"));
public static String aesEncrypt(String content, String encryptKey) throws Exception {
return base64Encode(aesEncryptToBytes(content, encryptKey));
public static String aesDecryptByBytes(byte[] encryptBytes, String decryptKey) throws Exception {
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(128);
Cipher cipher = Cipher.getInstance(ALGORITHMSTR);
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));
byte[] decryptBytes = cipher.doFinal(encryptBytes);
return new String(decryptBytes);
public static String aesDecrypt(String encryptStr, String decryptKey) throws Exception {
return aesDecryptByBytes(base64Decode(encryptStr), decryptKey);
public static void main(String[] args) throws Exception {
String content = "Test String么么哒";
验证码是用来区分人机的操作。&验证码划代的标准是人机识别过程中基于对人类知识的应用。&第一代:标准验证码&这一代验证码是即是我们常见的图形验证码、语音验证码,基于机器难以处理复杂的计算机视觉及语音识别问题,而人类却可以轻松的识别来区分人类及机器。这一代验证码初步利用了人类知识容易解答,而计算机难以解答的机制进行人机判断。
第二代:创新验证码&第二代验证码是基于第一代验证码的核心思想(通过人类知识可以解答,而计算机难以解答的问题进行人机判断)而产生的创新的交互优化型验证码。第二代验证码基于第一代验证码的核心原理--&人机之间知识的差异&,拓展出大量创新型验证码。
第三代:无知识型验证码&第三代验证码最大的特点是不再基于知识进行人机判断,而是基于人类固有的生物特征以及操作的环境信息综合决策,来判断是人类还是机器。无知识型验证码最大特点即无需人类思考,从而不会打断用户操作,进而提供更好的用户体验。&如Google的新版ReCaptcha、阿里巴巴的滑动验证。参考知乎&
2.2 验证码生成器
package com.jykj.demo.
import java.awt.C
import java.awt.F
import java.awt.Graphics2D;
import java.awt.image.BufferedI
import java.io.FileOutputS
import java.io.IOE
import java.io.OutputS
import java.util.R
import javax.imageio.ImageIO;
* 验证码生成器
public class ValidateCode {
2.3 控制器使用验证码 如 CodeController
@RequestMapping("/getCode.do")
public void getCode(HttpServletRequest reqeust, HttpServletResponse response) throws IOException {
response.setContentType("image/jpeg")
实现功能:前端AES加密传输后端解密以及n次输入验证不通过后需要验证码&有了上面的基础,实现起来应该不难了。
3.1 login.html
3.2 Controller
在请求登录页面时需要后端生成一个随机的16位字符串的key,用于前后端加密解密用,该key在登录成功后销毁,存储在session中。
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(){
接下来是提交form表单的请求
@RequestMapping(value = "/signIn", method = RequestMethod.POST,produces = "text/charset=UTF-8")
@ResponseBody
public String signIn(String username,String password,boolean remember,String checkCode) throws AuthorizationException{
System.out.println(username+","+password+","+remember+","+checkCode);
Object token = session.getAttribute(Helper.SESSION_LOGIN_TOKEN);
下面是生成随机数的工具类,很简单
package com.jykj.demo.
import java.util.R
public class RandomUtil {
public static final String ALLCHAR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static final String LETTERCHAR = "abcdefghijkllmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
public static final String NUMBERCHAR = "";
* 返回一个定长的随机字符串(只包含大小写字母、数字)
3.4 实现思路
现在淘宝登录界面采用的是 无知识型验证码,只需要拖动滑块来判断是否是机器还是人,如果拖滑块验证失败,会弹出验证码输入或点击选择的框,来进行二次验证。若验证成功后,连续5次输入错误的用户名或密码,则又会弹出验证码来需要继续验证。也就是说有一个风险分析系统,如果满足一定的条件(如连续多次输入错误等)则需要加强验证。风险分析系统要综合多种因素如ip,用户信息等等。Google更简单,通过点击复选框(I&m not a robot)就通过验证。
刚开始时是不需要验证码的,用session来存储剩余次数,当连续5次验证都失败后,该计数递减为0,则后台判断该客户端不是很可信,需要验证码来加强验证,重新刷新登录界面(可以重定向实现)把验证码输入框加载出来。客户端需要同时提交账号密码以及验证码到后台验证,若验证码通过验证,重新将次数复位(或自定义设置),表示该客户端暂时可信下次提交登录时可以不需要验证码。
对于密码的加密传输与后端解密,key的生成与销毁的控制很关键。当加载登录页面时,由后台生成一个key给该页面,并保存到隐藏域中,同时该key也是存在session中。前端js用AES加密算法将密码和key混合加密,提交给后台,后台用相应的解密算法还原出原始密码,然后该原始密码用存储时使用的多重混合加密算法进行加密与数据库中的密码匹配验证。当验证成功后,移除session中的key。而验证失败后的逻辑很关键,验证失败后,需要重新生成一个key给客户端,所以客户端通过返回的信息将key赋值到那个隐藏域字段中,这样达到刷新key的目的。
总体来说,验证码的逻辑会有点复杂。验证码的验证最好放到后台来验证,如果放到前台就需要用一个隐藏域字段来存这个验证码,这样的话机器也可以获取到,那机器就不用识别图片就可以验证了,这样验证码就失去了作用。
阅读(...) 评论()}

我要回帖

更多关于 js对密码加密 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信