使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)

摘要:
在正常情况下,使用md5加密varcrypto=require('crypto');Varmd5Sign=函数(数据){//添加字符编码varmd5=crypto.createHash('md5').update(data,Varmd5Sign=函数(data){///将字符转换为二进制流varstr=newBuffer(data).toString('binary');

正常情况下使用md5加密

var crypto = require('crypto');

var md5Sign = function (data) {
    var md5 = crypto.createHash('md5').update(data).digest('hex');
    return md5;
}

实际开发中经常需要前端nodejs调用后端java接口,使用上述方法会出现中文加密结果不同的情况,解决方法如下:

var crypto = require('crypto');

var md5Sign = function (data) {
    // 加入字符编码
    var md5 = crypto.createHash('md5').update(data, 'utf-8').digest('hex');
    return md5;
}

或者

var crypto = require('crypto');
var Buffer = require('buffer').Buffer; 

var md5Sign = function (data) {
    // 将字符转换成二进制流
    var str = new Buffer(data).toString('binary');
    var md5 = crypto.createHash('md5').update(str).digest('hex');
    return md5;
}

【crypto】

The crypto module provides cryptographic functionality that includes a set of wrappers for OpenSSL's hash, HMAC, cipher, decipher, sign and verify functions.

即:crypto是一套集成了包含OpenSSL的散列,HMAC、密码、解密、签名和验证功能的加密模块。

关于crypto加密模块的使用,可以参考:http://blog.fens.me/nodejs-crypto/

【md5】

MD5的全称是Message-Digest Algorithm 5(信息-摘要算法),它的作用是让大容量信息在用数字签名软件签署私人密匙前被“压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数).不管是md2、md4还是md5,它们都需要获得一个随机长度的信息并产生一个128位的信息摘要.

MD5 算法的哈希值大小为 128 位。是一种不可逆的算法。

算法特点:

  1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。

  2、容易计算:从原数据计算出MD5值很容易。

  3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。

  4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。

  5、不可逆性:MD5结果不能反推明文,不可逆。

  实际应用上,例如我知道‘password’的MD5值是5f4dcc3b5aa765d61d8327deb882cf99,那么我就用一个数据库存起来,只要我看到5f4dcc3b5aa765d61d8327deb882cf99,我就知道这个是口令‘password‘使用MD5处理之后的值,原来的口令就是’password'。MD5在身份鉴别系统中用于口令保护已经是很久了事情了,大部分黑客也有针对这种Hash方式准备相应的数据库进行反查,这种数据库称为彩虹表,MD5的安全性大大减弱。

【彩虹表】

彩虹表(Rainbow Table)是一个用于加密散列函数逆运算的预先计算好的表, 为破解密码的散列值(或称哈希值、微缩图、摘要、指纹、哈希密文)而准备。一般主流的彩虹表都在100G以上。 这样的表常常用于恢复由有限集字符组成的固定长度的纯文本密码。这是空间/时间替换的典型实践, 比每一次尝试都计算哈希的暴力破解处理时间少而储存空间多,但却比简单的对每条输入散列翻查表的破解方式储存空间少而处理时间多。使用加盐的KDF函数可以使这种攻击难以实现。

属性:密码对的集合

大小:主流的在100G以上

作用:快速地根据哈希值破解各类密码

参考资料:http://blog.csdn.net/u011202334/article/details/50585777

     http://blog.csdn.net/fdipzone/article/details/50768339

     http://blog.csdn.net/u011202334/article/details/50585777

               http://www.cnblogs.com/ajun/p/4167280.html

免责声明:文章转载自《使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇latex插图egin{minipage}强制左移hspace命令C#的dapper使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MSSQL 触发器

---触发器练习 --在SQL Server里面也就是对某一个表的一定的操作,触发某种条件,从而执行的一段程序 CREATE TABLE Student ( SID INT PRIMARY KEY --学号 ) CREATE TABLE BorrowRecord ( --学生借书记录表...

微信小程序开发中怎么设置转发(分享)的信息

如果什么都不设置,转发时默认名称是小程序的名称,转发的图片显示的是当前页面的截图,如图一 如何在自定义转发信息呢? 在进行转发的页面中: Page({ onShareAppMessage: function () { return { title: '做任务赢积分', imageUrl: '/images...

sql语句修改字段长度

sql语句修改字段长度alter table <表名> alter column <字段名> 新类型名(长度)例: alter table students alter column PhotoEnterSchool nvarchar(500) alter table students alter column PhotoGrad...

mysql 时间查询(当天、本周,本月,上一个月的数据)

今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT * FROM 表名 WHERE TO_DAYS( NOW( ) ) - TO_DAYS( 时间字段名) <= 1 近7天 SELECT * FROM 表名 where DATE_SUB(CURDATE(),...

oracle 解锁用户被锁住

1、通常我们遇到oracle用户密码输入多次错误,那么改用户就会变锁定,那么解决方法很简单,如下: 使用plsql工具sys用户登录(亦可dos命令输入:sqlplus / as sysdba ) 解锁 ALTER USER 用户名 ACCOUNT UNLOCK; 2、那么遇到这种用户会被锁的情况,我们可以设置用户密码无限次尝试登录,而该用户不会被锁定:...

select下拉框默认不能选择第一个选项的问题

      如题,现在有个js的功能:用户选择下拉框的同时,把选择的下拉框显示出来。同时选择的不能有重复的。刚开始 使用的是 select的onchange事件:       1 $("#liveType").on("change",function(){ 2 $("#selectedLiveType").append("<p><...