以前为了防止前端密码安全问题,都是对密码进行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对密码加密,服务器对密码进行校验的更多相关文章

  1. 【SpringBoot】SpringBoot集成jasypt数据库密码加密

    一.为什么要使用jasypt库? 目前springboot单体应用项目中,甚至没有使用外部配置中心的多服务的微服务架构的项目,开发/测试/生产环境中的密码往往是明文配置在yml或properties文 ...

  2. 使用BCrypt算法加密存储登录密码用法及好处

    //导入import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** *使用BCrypt算法加密存储登录密码 ...

  3. 使用bcrypt进行用户密码加密的简单实现

    Bcrypt百度百科: bcrypt,是一个跨平台的文件加密工具.由它加密的文件可在所有支持的操作系统和处理器上进行转移.它的口令必须是8至56个字符,并将在内部被转化为448位的密钥. 除了对您的数 ...

  4. 使用mongoose和bcrypt实现用户密码加密

    前面的话 最近在做的个人项目中,需要对密码进行加密保存,对该操作的详细步骤记录如下 介绍 关于mongoose已经写过博客就不再赘述,下面主要介绍bcrypt bcrypt是一个由两个外国人根据Blo ...

  5. 基于RSA的WEB前端密码加密方案

    受制于WEB页面源码的暴露,因此传统的对称加密方案以及加密密钥都将暴露在JS文件中,同样可以被解密. 目前比较好的解决方案是WEB页面全程或用户登录等关键环节使用HTTPS进行传输. 另外一种解决方案 ...

  6. 关于Web前端密码加密是否有意义的总结

    关于Web前端密码加密是否有意义的总结    :    https://blog.csdn.net/hla199106/article/details/45114801 个人:加密涉及到的是前后端的数 ...

  7. powershell加KeePass实现,加密服务器密码清单文件

    powershell加KeePass实现,加密服务器清单文件   powershell传教士翻译,改写. 2020-02-27   原文: https://www.altaro.com/msp-doj ...

  8. 密码加密与微服务鉴权JWT

    博客学习目标 1.用户注册时候,对数据库中用户的密码进行加密存储(使用 SpringSecurity). 2.使用 JWT 鉴权认证. 一.BCrypt 密码加密 1.常见的加密方式 任何应用考虑到安 ...

  9. 电信级的RSA加密后的密码的破解方法

    一直以来,电信通过HTTP劫持推送广告的方式已经存在了很多年了,这种手段至今并未停止.这种手段月光博客曾经有多次曝光,见<电信级的网络弹出广告>.<获取了电信恶意弹出广告的罪证> ...

随机推荐

  1. vue & vue router & match bug

    vue & vue router & match bug match bugs solution name must be router https://stackoverflow.c ...

  2. convert image to base64 in javascript

    convert image to base64 in javascript "use strict"; /** * * @author xgqfrms * @license MIT ...

  3. base 64 & blob & image url

    base 64 & blob & image url base 64 image & e.clipboardData.items[1] https://codepen.io/x ...

  4. IM & WebSockets

    IM & WebSockets WebSocket API https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API ht ...

  5. 2020 新型肺炎病毒疫情 & 远程办公

    2020 新型肺炎病毒疫情 & 远程办公 2020 新型肺炎病毒疫情 https://zhuanlan.zhihu.com/p/104406687 钉钉 微信 code gitlab PRD ...

  6. postman 发送数组

    原文 users[]:aa users[]:22 object[] // { users: [ { name: ' "ajanuw"', pwd: ' "aaa" ...

  7. Java中Singleton的三种实现方式解析

    一.什么是Singleton? <设计模式>的作者.Eclipse和 Junit 的开发者 Erich Gamma 在它的理论体系中将 Singleton 定义为仅仅被实例化一次的类.在当 ...

  8. 08_MySQL数据库的字段约束

    数据库的字段约束 实战: CREATE TABLE t_teacher ( id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, name VARCHAR(20) N ...

  9. 使用 Tye 辅助开发 k8s 应用竟如此简单(四)

    续上篇,这篇我们来进一步探索 Tye 更多的使用方法.本篇我们来了解一下如何在 Tye 中如何进行日志的统一管理. Newbe.Claptrap 是一个用于轻松应对并发问题的分布式开发框架.如果您是首 ...

  10. Laravel Queues 队列应用实战

    队列,顾名思义,排着队等着做事情.在生活场景中,凡是排队的人,都是带有目的性的.要完成某件事情,才去排队的,要不没有谁会闲到排队玩儿.而在软件应用层面,队列是什么,队列有什么优点,我们什么时候需要用队 ...