您的位置 首页 golang

前端使用bcrypt对密码加密,服务器对密码进行校验

下面是一个示例代码,启动一个http服务器,浏览器输入 ,当填入密码与服务器一致时提示成功,不一致时报错。

 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="#34;></script>
<script type="text/javascript" src="#34;></script>
</head>
<body>
<p>密码: <input id="pass" type="password" name="pass"/></p>
<button type="button" onclick="login()">提交</button>
<script type="text/javascript">
function login() {
/*  */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对密码加密,服务器对密码进行校验

文章地址:https://www.zhihuclub.com/98446.shtml

关于作者: 智云科技

热门文章

网站地图