关于加密算法:视频加密能做到完全防止外传播吗

在线培训教育机构越来越多的开办,对于视频平安要求也越来越高。网课视频经常出现被翻录盗播,对于机构来说是很难解决的一件事。市面上加密软件非常多,每个软件的性能都有所不同。那么为了保障视频的安全性,所用的加密软件有哪些技术呢?1、防录屏机制,应用时可能检测到录屏软件的开启。2.应用关键帧加密技术,加密后文件字节无很大变动,观看无压力。3、加密后的视频文件不论是在服务器上、还是在传输过程中、浏览器的缓存中,均为加密模式的文件,即便被下载也无奈失常播放。4、在线课程的播放还能够限度网站播放域名、只有在容许的域名下才能够观看,转发后也是无奈观看。5、在观看离线视频的时候,用户必须应用机器码来获取激活码受权观看; 只能与一台设施绑定;可设置播放次数和观看日期;限度播放器播放应用专门的播放器。6、logo和水印能够指定地位呈现,水印可填写学员的ID标识信息后设置动静,播放时随机呈现。 7、点量还有一种线上视频课程加密形式就是在观看时弹出问题,观看者只有在正确答复问题后能力持续播放,如问题答复谬误,视频能够被跳至其它指定工夫点后禁止观看等。以上几点根本就能够做到无效避免视频课程被破解、被翻录、被提取和非法流传。

October 11, 2021 · 1 min · jiezi

关于加密算法:奇妙的安全旅行之加密算法概述

前言hi,大家好呀,信息安全作为以后社会中比拟重要的一个课题,曾经笼罩了人们生存的方方面面,尽管有时候咱们可能并没有意识到,其实信息安全防护曾经在背地默默的爱护咱们的信息安全了。例如,当你在互联网上浏览网站时;当你筹备注册或者登陆一个网站,须要输出明码时;当你在购物网站买商品进行领取时;当你到银行取钱时... 能够说信息安全是关系国家、城市信息、行业用户、百姓利益的关键问题,尤其是数据安全,身份隐衷等信息的平安对于每个人都很重要。互联网最后,大家的安全意识还没有那么高,很多信息都是明文传输,甚至数据库中也是明文传输,这就带来了很多平安问题,比方网站被劫持,数据库被拖库,集体明码遭泄露等,曾经给企业和社会都带来了十分高的威胁性。 明天咱们就带大家一起开启咱们的本次平安旅行,给大家具体深刻的解说一下加密算法的前世今生。本次平安之旅会带大家深刻的理解一下咱们在开发中罕用到的一些加密算法及实现形式(本次示例均应用Java语言实现),心愿能加强大家对加密算法的理解和意识,并能依据业务场景纯熟利用。如果大家喜爱这个系列的文章,欢送大家点赞、分享,在这里谢谢大家的反对啦! 根底概念密码学的倒退曾经很久了,早在古希腊期间,人类就创造了置换明码。二战期间,德国军方启用“恩尼格玛”密码机,密码学在和平中起着十分重要的作用。在1997年,美国国家标准局颁布施行了“美国数据加密规范(DES)”,民间力量开始全面染指密码学的钻研和利用中,采纳的加密算法有 DES、RSA、SHA 等。 在密码学中有一些根底的概念,在咱们正式开始学习之前,咱们先从理解一下密码学中的相干概念。 「明文」:指没有通过加密的信息或数据,通常能够间接辨认出,例如个人信息、明码等。因为没有通过加密,明文很容易被辨认与破解,因而在传输明文之前必须进行加密解决。「密文」:将明文通过加密算法依照肯定规定进行加密之后,明文就会变成密文,通常为一堆无序字符,密文的模式简单难以辨认及了解。「密钥」:加密算法中应用的加密参数,它是在明文转换为密文或将密文转换为明文的算法中输出的参数。密钥分为对称密钥与非对称密钥。「加密」:将明文通过加密算法变成密文的过程。「对称加密」:通信单方同时把握一个密钥,加密解密都是由一个密钥实现的(即加密密钥等于解密密钥,加解密密钥能够互相推倒进去)。单方通信前独特拟定一个密钥,不对第三方公开。「分组加密」:分组明码是将明文分成固定长度的组,每一组都采纳同一密钥和算法进行加密,输入也是固定长度的密文。「解密」:将密文通过加密算法解密还原为明文的过程。加密算法随着技术的倒退,也同时为了应答加密算法的安全性,咱们的加密算法和平安保障伎俩也是一直变动降级的,目前在工作中罕用的加密算法次要分为以下几种: 音讯摘要算法对称加密算法非对称加密算法国密算法每种算法又包含不同的实现,其算法复杂度、安全性以及效率都有区别,为了便于大家从整体上对加密算法有个整体意识,我绘制了上面这种图,须要的倡议珍藏保留。 加密算法 音讯摘要算法音讯摘要算法也被称为哈希(Hash)算法或散列算法,是一种单向加密算法。在信息安全技术中,常常须要验证音讯的完整性,散列(Hash)函数提供了这一服务,它对不同长度的输出音讯,产生固定长度的输入。这个固定长度的输入称为原输出音讯的"散列"或"音讯摘要"(Message digest)。散列算法从严格意义上来讲并不算是加密算法,因为其后果是不可逆的,既然是不可逆的,那么当然不是用来加密的,而是次要用来做数字签名的。 音讯摘要算法次要蕴含以下三种: MD (Message Digest) 音讯摘要算法SHA (Secure Hash Algorithm) 平安散列算法HMAC (Keyed-Hashing for Message Authentication) 音讯认证码算法「常见的音讯摘要算法有」:MD2、MD4、MD5、SHA-1、SHA-256、SHA-512、HMAC 等。 音讯摘要算法具备如下几个个性: 运算速度快输入长度固定运算不可逆:已知运算后果的状况下,无奈通过逆运算失去原文。高度离散性:输出值的轻微变动,会导致运算后果差别微小。弱碰撞性:不同输出值的散列值极低概率会呈现后果雷同。MD 算法MD 算法是由驰名的非对称算法 RSA 发明人之一的罗纳德·李维斯特设计,MD 系列蕴含 MD2、MD4 以及最典型的 MD5。MD5的全称是Message-Digest Algorithm 5(信息-摘要算法第五版),是由 MD2 和 MD4 倒退而来。 SHA 算法SHA 算法,即平安散列算法(Secure Hash Algorithm)是一种与MD5同源的数据加密算法,该算法通过加密专家多年来的倒退和改良已日益完善,当初已成为公认的最平安的散列算法之一,并被宽泛应用。 SHA 实际上是一系列算法的统称,别离包含:SHA-1、SHA-224、SHA-256、SHA-384 以及 SHA-512。 HMAC 算法HMAC 是密钥相干的音讯认证码,HMAC 运算利用哈希算法,以一个密钥和一个音讯为输出,生成一个音讯摘要作为输入。 咱们在应用 MD 或 SHA 音讯摘要算法时,能够保证数据的完整性。然而在网络传输场景下,音讯发送者仅发送原始数据和数据摘要信息是不够的,黑客能够通过假装原始数据和数据摘要信息,达到攻打的目标,HMAC 算法通过密钥和数据独特生成音讯摘要,黑客在不晓得密钥的状况下,伪造数据和音讯摘要难度进一步加大。 对称加密算法对称加密算法是利用较早的加密算法,技术比拟成熟。在对称加密算法中,数据发送方将明文和加密密钥一起通过特定的加密算法解决后,使其变成简单的、无奈了解的加密密文后发送给接管方。接管方收到密文报文后,若想解读原文,则须要应用报文加密时用的同一个密钥及雷同算法对密文进行解密,能力使其复原成可读明文。在对称加密算法中,单方应用的密钥只有一个,单方都须要应用这个密钥对数据进行加密和解密,这就要求解密方当时必须取得加密密钥。 「常见的对称加密算法有」:DES、3DES(TripleDES)和AES。 DES 算法DES 算法全称为 Data Encryption Standard,即数据加密算法,它是IBM公司于1975年钻研胜利并公开公布的。DES 算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节,共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作形式,有两种:加密或解密。 ...

January 11, 2021 · 1 min · jiezi

啊啊啊啊啊啊啊啊啊

啊啊啊啊啊啊啦啦啦啦

June 19, 2019 · 1 min · jiezi

使用KeyStore工具生成椭圆曲线ECDSASECP256K1-算法的公私钥对

1.从如下地址下载keystore工具https://keystore-explorer.org... 2.创建keystore 3.选择PKCS#12 4.右键并选择Generate Key Pair 5.Key Pair 参数依次选择EC ->set = SEC -> Named Curve = secp256k1 6.配置name 7.指定Alias并输入密码即完成了kesstore生成 8.右键ViewDetails 可以查看PEM格式的公钥和私钥

April 28, 2019 · 1 min · jiezi

「 加密算法 」SHA

一. 简介SHA家族的五个算法,分别是SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美国安全局(NSA)所设计,并由美国国家标准与技术研究院(NIST)发布;是美国的政府标准。后四者有时并称为SHA-2。SHA-1,哈希(Hash)算法,一个非常流行的加密散列函数。在许多安全协议中广为使用,通常被用做密码加密,文件校验等,曾被视为MD5的后继者,且存在不可逆性.(和MD5同为MD4导出,所以具备一定的相似性)这个算法的思想是输入长度不限的明文,产出一个160位的信息摘要(比MD5多出32位).也是会压缩原来的内容,输出固定长度的散列值.在一定的强度上,它比MD5的强度更高.二. 破解早在05年的时候,我国的王小云教授成功的提出了MD5成功碰撞.(不同的原始数据得到相同的密文),继而又提出了sha1的碰撞,可是并无实例.在2017年,谷歌成功的对sha1进行了碰撞,当时震动了世界,也就是说sha1算法不再那么安全.其成功碰撞,能使用两个不同的原始数据得到相同的摘要.这个时候,如果有恶意攻击者使用这种冲突,用恶意文件来替换掉安全文件,而接收者通过相同的信息摘要,并不能识别出来文件的性质,可能造成严重的后果.但是对于sha1的破解难度还是有一定的难度,需要相当的条件才能有具备这个能力.下面的列出了一些数字,让大家了解破解这种算法所需要的计算规模有多大:总计900万兆(即百万的五次幂,具体为9,223,372,036,854,775,808)次SHA1计算。要完成攻击的首个阶段需要单一CPU计算6500年。要完成攻击的第二阶段需要单一GPU计算110年。md5:只需要一个智能手机30秒就破解了。sha-1 shattered:110GPU 需要一年;sha-1 bruteforce:12000000GPU 需要一年。总之,就是也就只有谷歌这些云计算基础设施才能搞得定,不是谁都可以.而且后面还有更为安全的sha2算法.所以从2017年1月发布的第56版开始,Chrome会将任何受SHA-1证书保护的网站视为不安全。 Firefox已计划于2017年初推出此功能,已于2017年2月24日淘汰了SHA-1。三. 前端应用1.crypto-js功能强大,不止处理MD5,支持的模块非常多,star数目前6k+,前后端可用.//后端 npm包管理npm install crypto-jsimport sha256 from ‘crypto-js/sha256’;import hmacSHA512 from ‘crypto-js/hmac-sha512’;import Base64 from ‘crypto-js/enc-base64’;const message, nonce, path, privateKey; // …const hashDigest = sha256(nonce + message);const hmacDigest = Base64.stringify(hmacSHA512(path + hashDigest, privateKey));//前端 Brower管理bower install crypto-js2.jsSHA专注处理sha加密,目前star数1k+.能够处理sha家族(SHA-1,SHA-224,SHA3-224,SHA-256,SHA3-256,SHA-384,SHA3-384,SHA-512,SHA3-512,SHAKE128 ,和SHAKE256以及HMAC)使用所需的哈希类型,输入类型和选项作为参数实例化新的jsSHA对象。哈希类型可以是SHA-1,SHA-224,SHA3-224,SHA-256,SHA3-256,SHA-384,SHA3-384,SHA-512,SHA3-512,SHAKE128或SHAKE256之一。输入类型可以是HEX,TEXT,B64,BYTES或ARRAYBUFFER之一。然后,您可以使用update对象函数对输入进行流式处理,如果需要,可以多次调用它。最后,只需getHash使用输出类型作为参数调用(B64,HEX,BYTES或ARRAYBUFFER)。npm install jssha//引用jsSHA = require(“jssha”);//使用var shaObj = new jsSHA(“SHA-512”, “TEXT”);shaObj.update(“This is a “);shaObj.update(“test”);var hash = shaObj.getHash(“HEX”);

April 20, 2019 · 1 min · jiezi

「 加密算法 」MD5

一.简介MD5是一种信息摘要算法(Message-Digest Algorithm),可以产生出一个128位(8位(bit)=1字节(byte),16字节)的散列值(hash).12345 MD5===> e10adc3949ba59abbe56e057f20f883e// 说好的128位,为什么有32个字符.//这串码是16进制表示,1位==4位二进制.112345 MD5===> e10adc3949ba59abbe56e057f20f883e2// 说好的128位,为什么有32个字符.3//这串码是16进制表示,1位==4位二进制.源于其算法,不管是对于多大的文件数据进行MD5加密,所得到结果的长度都是32个字符(1个中文字符等于2个字节,一个字母字符等于一个字节).对于内容相同的数据进行加密,得到的结果必然是相同的,如果内容有改动,哪怕是一个字节,其MD5值也会改动.所以也可以说MD5是有损算法,在一定程度有丢失.举一个假设就是压缩文件,前后可以进行压缩和解压,并且内容是不可以丢失的,如果采用MD5来做,那么解压后肯定有一部分的数据丢失了,肯定不可取.所以MD5的结果是不可逆运算的,也就是几乎不可能通过MD5值去逆推出原始数据.因为不管是多大的文件最终都是转化成128位的值,所以现实是可能存在有不同的原始数据被转化成同样的MD5值的.但是想主动搜寻两个不同的数据,让他们具有相同的MD5值,是非常困难.或者有一个原始数据和它的MD5数据,想再找一个和其MD5数据一样的原始数据也几乎是不可能的.但是并不是说MD5是完全不可破解的.有专业的黑客甚至普通黑客也可以利用MD5值实际是有损压缩技术这一原理,将MD5的逆运算的值作为一张表俗称彩虹表的散列表来破解密码。市面上也有不少的MD5破解网站,大体的原理类似,通过查字典的方式去查找.二.应用01. 一致性检验比如说在进行文件下载的时候,会生成文件内容的MD5值.等到文件完整下载的时候,再用该文件得出MD5值和之前的文件的MD5值进行对比,用以确认文件的内容的一致性.有很多时候,你会发现网络上的很多文件的命名都是一段hash值加后缀名的方式.这样处理的好处是能在一定的程度上避免同名,更大的用处是能够根据其文件内容来获取专属的MD5值来命名.这样做,可以算是以内容来命名,可以一定程度上避免资源的浪费,重复的文件.所以说,MD5有点类似"指纹",每一个都独一无二.只要内容不一致,就产生不一样的MD5值.利用MD5算法来进行文件校验的方案被大量应用到软件下载站、论坛数据库、系统文件安全等方面.02. 数字签名MD5的典型应用是对一段字符串(重要隐私信息)产生,以防止被“篡改”。你将一段话写在一个文件中,并产生一个MD5的值并记录在案,然后你可以传播这个文件给别人,别人如果修改了文件中的任何内容,你对这个文件重新计算MD5时就会发现(两个MD5值不相同)。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。03. 安全访问认证在现实的大部分场景都有登录的需要.当用户登录的时候,系统把用户输入的密码进行MD5 Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。三. 原理MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。引用自-刘俊辉. MD5 消息摘要算法实现及改进[J]. 福建电脑, 2007 (4): 92-93.function md5(string) { function md5_RotateLeft(lValue, iShiftBits) { return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)); } function md5_AddUnsigned(lX, lY) { var lX4, lY4, lX8, lY8, lResult; lX8 = (lX & 0x80000000); lY8 = (lY & 0x80000000); lX4 = (lX & 0x40000000); lY4 = (lY & 0x40000000); lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF); if (lX4 & lY4) { return (lResult ^ 0x80000000 ^ lX8 ^ lY8); } if (lX4 | lY4) { if (lResult & 0x40000000) { return (lResult ^ 0xC0000000 ^ lX8 ^ lY8); } else { return (lResult ^ 0x40000000 ^ lX8 ^ lY8); } } else { return (lResult ^ lX8 ^ lY8); } } function md5_F(x, y, z) { return (x & y) | ((~x) & z); } function md5_G(x, y, z) { return (x & z) | (y & (~z)); } function md5_H(x, y, z) { return (x ^ y ^ z); } function md5_I(x, y, z) { return (y ^ (x | (~z))); } function md5_FF(a, b, c, d, x, s, ac) { a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_F(b, c, d), x), ac)); return md5_AddUnsigned(md5_RotateLeft(a, s), b); }; function md5_GG(a, b, c, d, x, s, ac) { a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_G(b, c, d), x), ac)); return md5_AddUnsigned(md5_RotateLeft(a, s), b); }; function md5_HH(a, b, c, d, x, s, ac) { a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_H(b, c, d), x), ac)); return md5_AddUnsigned(md5_RotateLeft(a, s), b); }; function md5_II(a, b, c, d, x, s, ac) { a = md5_AddUnsigned(a, md5_AddUnsigned(md5_AddUnsigned(md5_I(b, c, d), x), ac)); return md5_AddUnsigned(md5_RotateLeft(a, s), b); }; function md5_ConvertToWordArray(string) { var lWordCount; var lMessageLength = string.length; var lNumberOfWords_temp1 = lMessageLength + 8; var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64; var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16; var lWordArray = Array(lNumberOfWords - 1); var lBytePosition = 0; var lByteCount = 0; while (lByteCount < lMessageLength) { lWordCount = (lByteCount - (lByteCount % 4)) / 4; lBytePosition = (lByteCount % 4) * 8; lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount) << lBytePosition)); lByteCount++; } lWordCount = (lByteCount - (lByteCount % 4)) / 4; lBytePosition = (lByteCount % 4) * 8; lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition); lWordArray[lNumberOfWords - 2] = lMessageLength << 3; lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29; return lWordArray; }; function md5_WordToHex(lValue) { var WordToHexValue = “”, WordToHexValue_temp = “”, lByte, lCount; for (lCount = 0; lCount <= 3; lCount++) { lByte = (lValue >>> (lCount * 8)) & 255; WordToHexValue_temp = “0” + lByte.toString(16); WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2); } return WordToHexValue; }; function md5_Utf8Encode(string) { string = string.replace(/\r\n/g, “\n”); var utftext = “”; for (var n = 0; n < string.length; n++) { var c = string.charCodeAt(n); if (c < 128) { utftext += String.fromCharCode(c); } else if ((c > 127) && (c < 2048)) { utftext += String.fromCharCode((c >> 6) | 192); utftext += String.fromCharCode((c & 63) | 128); } else { utftext += String.fromCharCode((c >> 12) | 224); utftext += String.fromCharCode(((c >> 6) & 63) | 128); utftext += String.fromCharCode((c & 63) | 128); } } return utftext; }; var x = Array(); var k, AA, BB, CC, DD, a, b, c, d; var S11 = 7, S12 = 12, S13 = 17, S14 = 22; var S21 = 5, S22 = 9, S23 = 14, S24 = 20; var S31 = 4, S32 = 11, S33 = 16, S34 = 23; var S41 = 6, S42 = 10, S43 = 15, S44 = 21; string = md5_Utf8Encode(string); x = md5_ConvertToWordArray(string); a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476; for (k = 0; k < x.length; k += 16) { AA = a; BB = b; CC = c; DD = d; a = md5_FF(a, b, c, d, x[k + 0], S11, 0xD76AA478); d = md5_FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756); c = md5_FF(c, d, a, b, x[k + 2], S13, 0x242070DB); b = md5_FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE); a = md5_FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF); d = md5_FF(d, a, b, c, x[k + 5], S12, 0x4787C62A); c = md5_FF(c, d, a, b, x[k + 6], S13, 0xA8304613); b = md5_FF(b, c, d, a, x[k + 7], S14, 0xFD469501); a = md5_FF(a, b, c, d, x[k + 8], S11, 0x698098D8); d = md5_FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF); c = md5_FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1); b = md5_FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE); a = md5_FF(a, b, c, d, x[k + 12], S11, 0x6B901122); d = md5_FF(d, a, b, c, x[k + 13], S12, 0xFD987193); c = md5_FF(c, d, a, b, x[k + 14], S13, 0xA679438E); b = md5_FF(b, c, d, a, x[k + 15], S14, 0x49B40821); a = md5_GG(a, b, c, d, x[k + 1], S21, 0xF61E2562); d = md5_GG(d, a, b, c, x[k + 6], S22, 0xC040B340); c = md5_GG(c, d, a, b, x[k + 11], S23, 0x265E5A51); b = md5_GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA); a = md5_GG(a, b, c, d, x[k + 5], S21, 0xD62F105D); d = md5_GG(d, a, b, c, x[k + 10], S22, 0x2441453); c = md5_GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681); b = md5_GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8); a = md5_GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6); d = md5_GG(d, a, b, c, x[k + 14], S22, 0xC33707D6); c = md5_GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87); b = md5_GG(b, c, d, a, x[k + 8], S24, 0x455A14ED); a = md5_GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905); d = md5_GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8); c = md5_GG(c, d, a, b, x[k + 7], S23, 0x676F02D9); b = md5_GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A); a = md5_HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942); d = md5_HH(d, a, b, c, x[k + 8], S32, 0x8771F681); c = md5_HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122); b = md5_HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C); a = md5_HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44); d = md5_HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9); c = md5_HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60); b = md5_HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70); a = md5_HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6); d = md5_HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA); c = md5_HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085); b = md5_HH(b, c, d, a, x[k + 6], S34, 0x4881D05); a = md5_HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039); d = md5_HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5); c = md5_HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8); b = md5_HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665); a = md5_II(a, b, c, d, x[k + 0], S41, 0xF4292244); d = md5_II(d, a, b, c, x[k + 7], S42, 0x432AFF97); c = md5_II(c, d, a, b, x[k + 14], S43, 0xAB9423A7); b = md5_II(b, c, d, a, x[k + 5], S44, 0xFC93A039); a = md5_II(a, b, c, d, x[k + 12], S41, 0x655B59C3); d = md5_II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92); c = md5_II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D); b = md5_II(b, c, d, a, x[k + 1], S44, 0x85845DD1); a = md5_II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F); d = md5_II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0); c = md5_II(c, d, a, b, x[k + 6], S43, 0xA3014314); b = md5_II(b, c, d, a, x[k + 13], S44, 0x4E0811A1); a = md5_II(a, b, c, d, x[k + 4], S41, 0xF7537E82); d = md5_II(d, a, b, c, x[k + 11], S42, 0xBD3AF235); c = md5_II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB); b = md5_II(b, c, d, a, x[k + 9], S44, 0xEB86D391); a = md5_AddUnsigned(a, AA); b = md5_AddUnsigned(b, BB); c = md5_AddUnsigned(c, CC); d = md5_AddUnsigned(d, DD); } return (md5_WordToHex(a) + md5_WordToHex(b) + md5_WordToHex(c) + md5_WordToHex(d)).toLowerCase();}四. 前端的应用目前在GitHub上找到两个有MD5功能还不错的库(基于JavaScript)1.JavaScript-MD5功能单一,专门处理MD5.star数目前3k+,使用非常简单,并且前后端都可用.//前端<script src=“js/md5.min.js”></script>var hash = md5(“value”); // “2063c1608d6e0baf80249c42e2be5804”//后端npm install blueimp-md5require(“http”).createServer(function (req, res) { // The md5 module exports the md5() function: var md5 = require("./md5"), // Use the following version if you installed the package with npm: // var md5 = require(“blueimp-md5”), url = require(“url”), query = url.parse(req.url).query; res.writeHead(200, {“Content-Type”: “text/plain”}); // Calculate and print the MD5 hash of the url query: res.end(md5(query));}).listen(8080, “localhost”);console.log(“Server running at http://localhost:8080/”);2.crypto-js功能强大,不止处理MD5,支持的模块非常多,star数目前6k+,前后端可用.//后端 npm包管理npm install crypto-jsimport sha256 from ‘crypto-js/sha256’;import hmacSHA512 from ‘crypto-js/hmac-sha512’;import Base64 from ‘crypto-js/enc-base64’;const message, nonce, path, privateKey; // …const hashDigest = sha256(nonce + message);const hmacDigest = Base64.stringify(hmacSHA512(path + hashDigest, privateKey));//前端 Brower管理bower install crypto-js五. “加盐"如果想提高你的安全性,那么可以采取再进一步对原始数据进行“加盐”,“盐”就是一串比较复杂的字符串。你所添加的"盐"越长越复杂,加密后破解起来就越麻烦.你可以尝试下在原始数据上加一串复杂的字符串,然后再去进行MD5加密.这样即使解开MD5,也不能知道你的原始数据到底是那一段.但是即使这样也不可能绝对是绝对安全.这个“盐”还是有泄漏的风险。比如苹果端、安卓端、前端、后台等等那些个技术人员都是知道的,都有可能泄漏出去。放在服务器也不绝对安全,也有手段去抓取.但是相对的还是进一步的提高了加密的安全性. ...

April 20, 2019 · 7 min · jiezi