前端使用bcrypt对密码加密,服务器对密码进行校验
以前为了防止前端密码安全问题,都是对密码进行md5(password + salt)。
有些也会用别的加密方式,但还是会存在撞库,彩虹表等破解常规密码。
因此使用bcrypt加密是一个不错的选择,因为每次加密都会随机salt,每次加密结果都不一样,相对安全性更高些。
下面是一个示例代码,启动一个http服务器,浏览器输入http://127.0.0.1:8080
,当填入密码与服务器一致时提示成功,不一致时报错。
package main
import (
"flag"
"fmt"
"golang.org/x/crypto/bcrypt"
"net/http"
)
func main() {
pass := flag.String("p", "admin", "check password")
flag.Parse()
password := []byte(*pass)
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write(html)
})
http.HandleFunc("/users/login", func(w http.ResponseWriter, r *http.Request) {
hashedPassword := r.FormValue("pass")
fmt.Println(hashedPassword)
err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), password)
if err != nil {
fmt.Fprintln(w, err)
} else {
fmt.Fprintln(w, "password ok")
}
})
http.ListenAndServe(":8080", nil)
}
var html = []byte(`<!DOCTYPE html>
<html>
<head>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/dcodeIO/bcrypt.js/dist/bcrypt.min.js"></script>
<script type="text/javascript" src="https://cdn.jsdelivr.net/gh/jquery/jquery@3.2.1/dist/jquery.min.js"></script>
</head>
<body>
<p>密码: <input id="pass" type="password" name="pass"/></p>
<button type="button" onclick="login()">提交</button>
<script type="text/javascript">
function login() {
/* https://github.com/dcodeIO/bcrypt.js */
var bcrypt = dcodeIO.bcrypt;
/* 将密码加密提交 */
$.post('/users/login',{pass: bcrypt.hashSync($('#pass').val(), 8)},
function(result) {
alert(result);
}
);
}
</script>
</body>
</html>`)
该方案实际还是有一个问题,就是前端加密传输的文本是无法解密的。服务器只能用正确的密码同前端传上去的密文进行相同的加密规则比较密文是否一致。
此时服务器要么存明文密码,要么对密码做非对称加密,因为服务器是需要明文密码。以前使用md5值hash时,服务器直接存hash后的字符串,因此是没有问题的。
服务器存明文会存在密码泄露的风险,对密码做非对称或对称加密都会对服务器造成一些性能损耗。而且最终密码是可破解的。
有想过一个方案就是,前端初始获取rsa公钥,密码使用公钥加密,服务器使用私钥解密,然后把密码进行hash与数据库里面的hash值比较。有些人觉得这是多此一举。
总之各个方案都有各个方案的优缺点吧。
前端使用bcrypt对密码加密,服务器对密码进行校验的更多相关文章
- 【SpringBoot】SpringBoot集成jasypt数据库密码加密
一.为什么要使用jasypt库? 目前springboot单体应用项目中,甚至没有使用外部配置中心的多服务的微服务架构的项目,开发/测试/生产环境中的密码往往是明文配置在yml或properties文 ...
- 使用BCrypt算法加密存储登录密码用法及好处
//导入import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** *使用BCrypt算法加密存储登录密码 ...
- 使用bcrypt进行用户密码加密的简单实现
Bcrypt百度百科: bcrypt,是一个跨平台的文件加密工具.由它加密的文件可在所有支持的操作系统和处理器上进行转移.它的口令必须是8至56个字符,并将在内部被转化为448位的密钥. 除了对您的数 ...
- 使用mongoose和bcrypt实现用户密码加密
前面的话 最近在做的个人项目中,需要对密码进行加密保存,对该操作的详细步骤记录如下 介绍 关于mongoose已经写过博客就不再赘述,下面主要介绍bcrypt bcrypt是一个由两个外国人根据Blo ...
- 基于RSA的WEB前端密码加密方案
受制于WEB页面源码的暴露,因此传统的对称加密方案以及加密密钥都将暴露在JS文件中,同样可以被解密. 目前比较好的解决方案是WEB页面全程或用户登录等关键环节使用HTTPS进行传输. 另外一种解决方案 ...
- 关于Web前端密码加密是否有意义的总结
关于Web前端密码加密是否有意义的总结 : https://blog.csdn.net/hla199106/article/details/45114801 个人:加密涉及到的是前后端的数 ...
- powershell加KeePass实现,加密服务器密码清单文件
powershell加KeePass实现,加密服务器清单文件 powershell传教士翻译,改写. 2020-02-27 原文: https://www.altaro.com/msp-doj ...
- 密码加密与微服务鉴权JWT
博客学习目标 1.用户注册时候,对数据库中用户的密码进行加密存储(使用 SpringSecurity). 2.使用 JWT 鉴权认证. 一.BCrypt 密码加密 1.常见的加密方式 任何应用考虑到安 ...
- 电信级的RSA加密后的密码的破解方法
一直以来,电信通过HTTP劫持推送广告的方式已经存在了很多年了,这种手段至今并未停止.这种手段月光博客曾经有多次曝光,见<电信级的网络弹出广告>.<获取了电信恶意弹出广告的罪证> ...
随机推荐
- 2016 JS 笔试题汇总:
1 1 1 CS&S(中软国际): 1 JavaScript 循环表达式: 2 JavaScript表达式boolean返回值: 3 网页中的事件/HTML 事件属性/JavaScript ...
- CSS Multiple Columns
CSS Multiple Columns CSS layout column-count column-gap column-rule-style column-rule-width column-r ...
- Web 安全 & cookies & HttpOnly
Web 安全 & cookies & HttpOnly cookie HttpOnly 禁止 js 读取 cookie 的方法 HttpOnly 实现原理 document.cooki ...
- Dart & data type(static / dynamic)
Dart & data type(static / dynamic) Darts 飞镖 标枪 javelin/darts type https://dartpad.dartlang.org/ ...
- Linux零拷贝技术
本文转载自Linux零拷贝技术 导语 本文讲解 Linux 的零拷贝技术,云计算是一门很庞大的技术学科,融合了很多技术,Linux 算是比较基础的技术,所以,学好 Linux 对于云计算的学习会有比较 ...
- 在js中如何将字符串类型的日期("2020-11-30T02:21:42.000+0000")进行格式化
1.引入方法 import { formatDateNew } from '@/utils' 2.在方法中使用,注意要先将字符串进行new Date(),否则报错date.getFullYear is ...
- 微信小程序:给data中对象中的属性设置值与给data中的属性或对象或数组设置值的区别
一.给data中的属性或对象或数组设置值,属性名不需要加引号 this.setData({ material: param, // 这里material为对象 } this.setData({ d ...
- 【资源下载】安卓VS鸿蒙第三方件切换宝典 V1.0
下载<安卓VS鸿蒙第三方件切换宝典> 由于字数较多,本文仅展示部分,查看完整版请点击上方下载 众所周知,安卓应用开发经过这么多年的发展相对成熟和稳定,鸿蒙OS作为后来者兼容一个成熟的开发体 ...
- h5返回上一页ios页面不刷新
var isPage=false; window.addEventListener('pageshow', function () { if (isPage) { window.loc ...
- kubernetes Pod亲和性
三种调度粘性,主要根据官方文档说明: NodeSelector(定向调度).NodeAffinity(Node亲和性).PodAffinity(Pod亲和性). 1. nodeSelecto ...