nacos 二次开发 页面登录密码加密传输
为什么要做页面登录密码加密
现在公司不定期进行漏洞扫描,其中漏洞包括前后端登录密码使用明文。nacos官方强烈推荐nacos在内网运行,所以在验证这块做的比较简单。
注意: nacos版本 2.3.0
如何去实现
重要: nacos启动后默认账户nacos的密码也是nacos,且无法配置。这就导致加密jar会将“nacos”进行加密,导致认证不通过,无法进入页面修改账户密码(通过白名单访问修改密码接口也一直不成功),所以会先将通过未加密jar启动,通过非加密进入系统,在页面进行密码修改成sha256处理之后的密码,然后再用加密jar替换非加密jar
我使用的是embed berdy数据库,有办法在加密jar情况下修改密码的请回复我
- 步骤1: 拉取nacos项目(国内镜像 https://gitee.com/mirrors/Nacos),修改配置文件开启权限、设置白名单,启动项目。
- 步骤2: 使用默认账号nacos(密码也是nacos)登录,修改密码(新密码填入的是 新密码经过SHA256哈希处理的值,而非新密码原文!新密码原文后期登录时使用)
- 步骤3:在另外目录拉取源码, IDEA中对页面键入的password进行SHA256哈希处理之后再发起XHR
- 步骤4:将新项目打包得到新的nacos-server.jar, 用他替换老jar包,启动nacos服务后密码会加密传输
步骤1 如何打包启动nacos(Windows为例)?
修改配置文件(location:E:\Nacos\distribution\conf\application.properties )
### true开启鉴权
nacos.core.auth.enabled=true
### 设置白名单,并不是用户名,用户密码! 使用时在XHR请求头 authKey:nacosSecurity
nacos.core.auth.server.identity.key=authKey
nacos.core.auth.server.identity.value=nacosSecurity
### 使用随机生成的Base64串,要求32位以上.串生成网站https://base64.supfree.net
nacos.core.auth.plugin.nacos.token.secret.key=SecretKey012345678901234567890123456789012345678901234567890123456789
修改启动文件,启动模式由cluster改为standalone
set MODE="standalone"
nacso主目录下打开Terminal窗口,执行mvn命令
mvn -Prelease-nacos -DskipTests clean install -U
点击运行 E:\Nacos\distribution\target\nacos-server-2.3.0\nacos\bin\startup.cmd
步骤2 如何修改默认账号nacos密码?
http://127.0.0.1:8848/nacos/#/login 进入登录页面
此处密码填入sha256加密过的字符串 SHA256转换
如: nacos” —sha256—> 569BF0AF7A7562F31BBE4795656B6BDF307F7752163ABC139157E3A3033B43FF
密码,确认密码,填入 569BF0AF7A7562F31BBE4795656B6BDF307F7752163ABC139157E3A3033B43FF
======== 下面在其他目录重新拉取nacos源码进行操作 ========
步骤3 如何对明文加密?
1: 修改对页面键入密码进行SHA256哈希处理,页面有三处会键入密码
- 新增账户
- 修改账户密码
- 登录账户
在新的目录拉取 https://gitee.com/mirrors/Nacos源码进行操作
- 引入crypto库 , 在E:\Nacos0115\console-ui\目录下打开Terminal窗口,/输入安装crypto包指令
npm install crypto
- 代码修改
新增账户,修改账户password 加密处理,D:\Nacos\console-ui\src\reducers\authority.js
// 引入crypto库,在创建用户,重置密码代码处进行加密
const crypto = require('crypto');
function sha256Encrypt(password) {
// 创建SHA256哈希对象
const hash = crypto.createHash('sha256');
// 将要哈希的数据作为流传递给哈希对象
hash.update(password);
// 获取哈希结果
const hashValue = hash.digest('hex');
return hashValue.toString();
}
// ...
/**
* 创建用户
* @param {*} param0
*/
const createUser = ([username, password]) => {
password = sha256Encrypt(password);
request.post('v1/auth/users', { username, password }).then(res => successMsg(res));
};
/**
* 重置密码
* @param {*} param0
*/
const passwordReset = ([username, newPassword]) => {
newPassword = sha256Encrypt(newPassword);
request.put('v1/auth/users', { username, newPassword }).then(res => successMsg(res));
};
登录账户,修改账户password 加密处理,D:\Nacos\console-ui\src\pages\Login\Login.jsx
// 添加crypto库
const crypto = require('crypto');
function sha256Encrypt(password) {
// 创建SHA256哈希对象
const hash = crypto.createHash('sha256');
// 将要哈希的数据作为流传递给哈希对象
hash.update(password);
// 获取哈希结果
const hashValue = hash.digest('hex');
return hashValue.toString();
}
// ...
handleSubmit = () => {
const { locale = {} } = this.props;
this.field.validate((errors, values) => {
if (errors) {
return;
}
// 对密码进行SHA-256加密
values.password = sha256Encrypt(values.password);
login(values)
.then(res => {
localStorage.setItem('token', JSON.stringify(res));
this.props.history.push('/');
})
.catch(() => {
Message.error({
content: locale.invalidUsernameOrPassword,
});
});
});
};
- 构建前端包
构建前端包 , 在E:\Nacos0115\console-ui\目录下打开Terminal窗口
npm install
// 输入构建指令,在\console-ui目录下生成dist目录
npm run build
npm run build执行时,由于高版本node下载低版本node的项目报错ssl
解决方法: 在package.json 脚本增加 SET NODE_OPTIONS=–openssl-legacy-provider
"scripts": {
"start": "cross-env NODE_ENV=development webpack-dev-server --config build/webpack.dev.conf.js",
"build": "SET NODE_OPTIONS=--openssl-legacy-provider && cross-env NODE_ENV=production webpack --config build/webpack.prod.conf.js && node build/copyFile.js",
"eslint": "eslint --ext .js src/",
"eslint-fix": "eslint --ext .js --fix src/"
},
将dist目录下文件覆盖D:\Nacos\console\src\main\resources\static\console-ui\public目录下文件.
- nacos项目整体打包
步骤4 如何替换成加密jar包,运行项目?
nacso主目录下打开Terminal窗口,执行mvn命令
mvn -Prelease-nacos -DskipTests clean install -U
关闭当前运行的nacos应用,使用加密的jar替换原项目的jar,在重新启动nacos
即:
D:\Nacos\distribution\target\nacos-server-2.3.0\nacos\target\nacos-server.jar 的jar去覆盖
E:\Nacos\distribution\target\nacos-server-2.3.0\nacos\target\nacos-server.jar
再次登录,可以看到密码nacos 会被加密成 32个字符串,并成功登录!