前端使用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劫持推送广告的方式已经存在了很多年了,这种手段至今并未停止.这种手段月光博客曾经有多次曝光,见<电信级的网络弹出广告>.<获取了电信恶意弹出广告的罪证> ...
随机推荐
- JavaScript console.log Questions All In One
JavaScript console.log Questions All In One "use strict"; /** * * @author xgqfrms * @licen ...
- super fast sort algorithm in js
super fast sort algorithm in js sort algorithm Promise.race (return the fast one) Async / Await // c ...
- SDK & 埋点 & user behavior tracker
SDK & 埋点 & user behavior tracker 同一个 SDK ,根据不同的应用市场, 分别进行统计分析 ? https://www.umeng.com/ user ...
- XML & XPath & XQuery
XML & XPath & XQuery full XPath demo https://www.w3.org/TR/xpath-full-text-30/ https://www.w ...
- 「NGK每日快讯」2021.2.8日NGK公链第97期官方快讯!
- Mybatis-04 日志、分页
Mybatis-04 日志.分页 日志 1.日志工厂 如果数据库操作出现异常,就需要打印日志来排错. 日志工厂会把日志工作委托实现: SLF4J Apache Commons Logging Log4 ...
- MPAndroidChart实现LineChart(折线图)
一.参照油管视频做法 1.引入依赖 新建Android工程,然后分别在build.gradle(Project:...)添加 maven { url 'https://jitpack.io' } 在b ...
- 2021-2-28:调用 System.gc() 后究竟发生了什么?
首先,根据 DisableExplicitGC 这个 JVM 启动参数的状态,确定是否会 GC,如果需要 GC,不同 GC 会有不同的处理. 1. G1 GC 的处理 如果是 System.gc() ...
- dubbo实战之一:准备和初体验
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 【Arduino学习笔记06】上拉电阻和下拉电阻
为什么要用上拉电阻和下拉电阻?--避免输入引脚处于"悬空"状态 下图是一个没有使用上拉电阻/下拉电阻的电路图: 在按键没有按下时,要读取的输入引脚没有连接到任何东西,这种状态就称为 ...