以前为了防止前端密码安全问题,都是对密码进行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. Linux 学习笔记分享: Linux 用户组的权限: drwx------ 700权限(d 目录 ,r=4,w=2,x=1:rwx=7;---=0;---=0)

    Linux 用户组的权限: drwx------ 700权限(d 目录 ,r=4,w=2,x=1:rwx=7;---=0;---=0) 1 1 Linux 用户组的权限: drwx------ 700 ...

  2. HTML5 Canvas 2D library All In One

    HTML5 Canvas 2D library All In One https://github.com/search?q=Javascript+Canvas+Library https://git ...

  3. macOS 显示/隐藏 AirPlay

    macOS 显示/隐藏 AirPlay AirPlay Sidecar 必须用相同的 Apple ID 登录 mac 和 ipad, 才能使用! https://www.apple.com/macos ...

  4. nasm astrncmp函数 x86

    xxx.asm: %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export as ...

  5. c++ winapi 让目标程序(target)调用当前程序(local)的函数

    GameCheat 如果你的目标程序是x86/x64, 那么当前程序也需要编译为x84/x64 #include <iostream> #include <string> #i ...

  6. js 触发长按事件

    为网站添加触摸功能 <button id="btn1">长按触发</button> <button id="btn2">长按 ...

  7. ts 索引签名 无视多余的属性类型

    interface SquareConfig { color?: string; width?: number; [propName: string]: any; } function asd(opt ...

  8. MongoDB的下载、安装与部署

    1.什么是MongoDB? 它是介于关系型数据库和非关系型数据库之间的一种NoSQL数据库,用C++编写,是一款集敏捷性.可伸缩性.扩展性于一身的高性能的面向文档的通用数据库. 2.为什么要用Mong ...

  9. NGK八大板块:为何郊区市场近来火爆?-VALAITIS, PETER ANTHONY分析

    PAUL ADAMS ARCHITECT LTD董事长VALAITIS, PETER ANTHONY称受大环境影响很多纽约人都选择离开纽约市中心,搬往附近郊区,因此附近地区楼市开始不断升温. 根据房地 ...

  10. 使用docker mediawiki,搭建网页wiki

    我只是想做一个大家都能访问的wiki,用于成员间共享和维护一些文档.找到了docker的mediawiki,这里记录一下我怎么搭的吧. 首先,如果你在一个局域网里,有公用的可以访问的服务器,那可以直接 ...