从Discuz迁移帐号密码到NodeBB

最近论坛要从Discuz改版到NodeBB中,由于原有dz框架使用了较长时间,积累了一定的用户数,为了对用户进行无感知的迁移,首先需要将账户登录的问题解决。

1. Discuz的加密方式

由于是从dz迁移到nodebb,所以得先了解dz的加密方式是如何实现的。
dz的加密方式比较简单,参考以下步骤:

1.首先密码明文pwd=123456,salt=666666(数据库中存放);

pwd=123456,salt=666666

2.对pwd进行一次md5,取32位小写结果hash1;

hash1=md5(pwd)

3.将hash1与salt进行拼接得到temp=hash1+salt;

temp=hash1+salt

4.对temp进行一次md5,取32为小写结果,即为数据库中的password字段。

password=md5(temp)

知道了dz的加密方式,下面就可以修改nodebb了

2. 修改Nodebb的注册和登录流程

主要涉及的文件有

1. `src/controllers/authentication.js`
2. `/src/bcrypt.js`
3. `/src/password.js`
4. `/src/user/create.js`

1.首先在注册的时候向数据库中同时存储salt字段,初始的salt最好与账户有一定关联,方便后续修改mongo数据库进行查询和修改(/src/user/create.js)

    async.parallel([async.apply(User.setUserField, userData.uid, 'password', hash),// 在用户进行注册的时候向User信息中增加salt字段,以便与dz的加密方式结合async.apply(User.setUserField, userData.uid, 'salt','123456'),async.apply(User.reset.updateExpiry, userData.uid),],next)

2.修改/src/bcrypt.js文件


process.on('message', function (msg) {if (msg.type === 'hash') {hashPasswordAsDz(msg.password, msg.salt, done);} else if (msg.type === 'compare') {compare(String(msg.password || ''), String(msg.hash || ''), msg.salt, done);}
});
//修改对密码的加密方式为dz的加密方式
function hashPasswordAsDz(password, salt) {var md5 = crypto.createHash('md5');md5.update(password);var hash1 = md5.digest('hex');md5 = crypto.createHash('md5');var content = hash1 + salt;md5.update(content);var hash2 = md5.digest('hex');done(null, hash2)
}
//修改比较密码时的逻辑,与dz保持一致
function compare(password, hash, salt, done) {var md5 = crypto.createHash('md5');md5.update(password);var hash1 = md5.digest('hex');md5 = crypto.createHash('md5');var content = hash1 + salt;md5.update(content);var hash2 = md5.digest('hex');if (hash2==hash)done(null, true);else done(null, false);
}function done(err, result) {if (err) {process.send({err: err.message});return process.disconnect();}process.send({result: result});process.disconnect();
}

3.修改/src/controllers/authentications.js

    userData: function (next) {db.getObjectFields('user:' + uid, ['password', 'passwordExpiry','salt'], next);},

在进行login的时候,额外提取salt值,便于后续传递给compare函数进行md5的计算。

    function (next) {Password.compare(password, userData.password, userData.salt,next);}

修改compare的参数列表,将userData中的salt也传递进去。

4.修改/src/password.js

function compare(password, hash,salt, callback) {getFakeHash(function (err, fakeHash) {if (err) {return callback(err);}forkChild({ type: 'compare', password: password, hash: hash || fakeHash ,salt:salt}, callback);});
}

修改为增加salt参数后的compare函数,这是调用bcrypt.js中的compare函数,并进行回调。

3.NodeBB小批量注册。

因为原论坛的数据量较小,且没有太多的时间去解析NodeBB的逻辑,所以采用最简单暴力的方法,通过selenium+pyvirtualdisplay来进行批量注册。帐号名和邮箱是dz里的数据,password随意,因为步骤4要改的。

def register(s_email, s_username, s_password):display = Display(visible=0, size=(800, 600))display.start()browser = webdriver.Chrome()browser.get(config.FORUM_HOME_URL)time.sleep(2)register = browser.find_element_by_xpath('//*[@id="logged-out-menu"]/li[1]/a');register.click();# 打开注册页面time.sleep(2)browser.refresh()# 获取注册列表项email = browser.find_element_by_id('email')username = browser.find_element_by_id('username')password = browser.find_element_by_id('password')password_confirm = browser.find_element_by_id('password-confirm')register = browser.find_element_by_id('register')# 填充值email.send_keys(s_email)username.send_keys(s_username)password.send_keys(s_password)password_confirm.send_keys(s_password)register.click()time.sleep(3)browser.refresh()# 获取协议同意按钮并提交aggree1 = browser.find_element_by_id('gdpr_agree_data')aggree2 = browser.find_element_by_id('gdpr_agree_email')submit = browser.find_element_by_xpath('//*[@id="content"]/form/div[2]/div/button')aggree1.click()aggree2.click()submit.click()time.sleep(3)

大概跑了半天的时间注册完成,然后开始修改mongodb数据库中的内容,来完成最后一步

4.修改NodeBB数据源

现在跑完步骤3其实可以使用我们设置的初始密码登陆,但是本意是迁移dz到NodeBB中,所以还需要修改NodeBB的数据库,这里以mongodb为例。

1.查看mongodb数据库里的内容,发现主要与一个文档有关。
2.

 {"_id": "id","_key": "user:1","acceptTos": 0,"banned": 0,"birthday": "","email": "cc.zhang1024@gmail.com","fullname": "","gdpr_consent": 1,"joindate": 1528885781389,"lastonline": 1529026648838,"lastposttime": 0,"location": "","picture": "","postcount": 0,"profileviews": 0,"reputation": 0,"signature": "","status": "online","topiccount": 0,"uid": 1,"uploadedpicture": "","username": "cc.zhang","userslug": "cc-zhang","website": "","password": "password","salt": "salt","passwordExpiry": 0}

其中_key='user:'+user.id,我们要做的就是找到相关的user账户然后修改其salt为dz导出的salt,以及修改password为dz导出的password即可。

data.update({'email': email, 'salt': old_salt}, {'$set': {'salt': new_salt, 'password': hash}})

这里是采用email和salt确定文档,然后进行更新。

5.登陆验证

打开登陆页面,输入在dz登陆的帐号密码验证是否成功,若提示失败可能需要重启服务器。目前仅是帐号密码部分进行了迁移和修改,可能还会有部分尚未完成修改,等后续发现再改吧

转载于:https://blog.51cto.com/13801588/2130847

从Discuz迁移帐号密码到NodeBB相关推荐

  1. Wireshark分析实战:某达速递登录帐号密码提取

    "使用某达速递的官网登陆及APP登录,来学习Wireshark的使用." 在如今这个HTTPS深入人心的情况下,作为一个也不算很小的快递,某达速递,不但全站HTTP,而且登录帐号密 ...

  2. WCF加密操作(包括证书和证书+帐号密码)

    WCF作为.net三大组件之一,伟大之处不用多说,但是其加密配置对于我这样的萌新来说还是颇有难度,因此将几天来的研究成果共享出来,与各位共勉~ 首先声明我的开发环境,Win10创意者更新 + Visu ...

  3. sasl java_javaSASL_SSL帐号密码方式访问kafka

    java SASL_SSL 帐号密码 方式访问 kafka Producer Java Sample java生产者: Properties props = new Properties(); pro ...

  4. HexorBase 登陆、执行语句、数据库帐号密码破解

    HexorBase Tool:整合了目前几大主流的数据库,包括登陆,执行语句,数据库帐号密码破解等功能. 安装HexorBase Tool,安装文件:hexorbase_1.0_all.deb 下载地 ...

  5. TortoiseGit bonobo gitserver记住帐号密码

    记住帐号密码有两种方式: 针对服务器存储用户名密码 设置方式为在windows用户存储位置创建文件_netrc,没有后缀名.用文本编辑内容,格式为 machine 115.29.141.162 只能是 ...

  6. 登陆163邮箱 验证邮箱帐号密码是否正确

    有些时候我们只需要验证邮箱的帐号密码是否正确.而不需要发邮件.用下面的代码吧. 要用到的jar包是jmail.jar  方法1 package com.cn.mail.test; import jav ...

  7. sasl java_java SASL_SSL 帐号密码 方式访问 kafka

    java SASL_SSL 帐号密码 方式访问 kafka Producer Java Sample java生产者: Properties props = new Properties(); pro ...

  8. 重装系统后服务器不提示用户密码,明明没有设置密码,重装系统后开机要求输入帐号密码咋办?...

    原标题:明明没有设置密码,重装系统后开机要求输入帐号密码咋办? 时常有用户在重装系统后出现开机需要输入帐号密码的情况,其实这是由于Administrator管理员帐号被停用导致的,出现这情况只要进入安 ...

  9. 微信小程序激活账号时,提示“此帐号已激活,请使用帐号密码直接登录”

    最近准备研究下微信小程序,先去申请个小程序账号.于是乎,在通过邮件中的链接激活账号时,遇到了这个问题. 解决方法 你没看错,就是字面的意思,去登录页,点击使用账号登录,千万不要扫码登录. 用之前注册的 ...

最新文章

  1. centos查看特定程序占用端口情况
  2. R语言replace函数数值替换实战
  3. 2011年复活节慕尼黑及其周边游之四-新天鹅堡
  4. POJ3481(待完善版本,请看注释)
  5. mysql workbench画E-R图,并根据E-R生成sql(步骤超完整)
  6. 一篇文章搞定百度OCR图片文字识别API
  7. oledb vc访问mdb数据库_SQL SERVER数据库技术-1
  8. Api文档生成工具与Api文档的传播(pdf)
  9. 如何使用 Java 中执行 Windows 的 CMD 命令
  10. jquery与php数据传输,【网页制作-jquery, php】key-value 网页书签(php与js之间的数据传递)...
  11. 【尚未完成,不建议参考】马氏距离,汉明距离
  12. Solr数据库6.3.0版本配置问题:whose UTF8 encoding is longer than the max length 32766
  13. PHP进销存源码 ERP多仓库管理系统带小程序,前端采用原生uniapp
  14. 【UML 建模】在线UML建模工具 ProcessOn 使用详解
  15. 中国互联网大人物直播简史
  16. 网络安全之认证,数字签名,报文摘要
  17. 四季电台应用项目源码
  18. oppo手机删除计算机怎样恢复,▷提示|如何将OPPO手机恢复为出厂设置
  19. 【数据结构】广义表的介绍
  20. C# 获取汉字拼音首字母(修正X问题,真正修正)

热门文章

  1. zabbix监控SNMP
  2. 源码安装MySQL5.5.20
  3. 页面发送请求到后台报错“Empty or invalid anti forgery header token.”问题解决
  4. Maven错误:“No goals have been specified for this build...”问题解决
  5. 解决新版本Vivado打开老工程IP锁住的问题
  6. 解决Android Studio安装过程中“SDK tools directory is missing”的问题
  7. JAVA编程思想——读书笔记 对象的容纳
  8. java设计汽车为父类_JAVA设计一个汽车类作为父类,包含汽车的相关属性和方法。电动汽车,普通汽车,混合汽车,...
  9. win11间歇性卡顿怎么办 windows11间歇性卡顿的解决方法
  10. win10英文系统一键装机教程