经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Go语言 » 查看文章
前端使用bcrypt对密码加密,服务器对密码进行校验
来源:cnblogs  作者:janbar  时间:2021/4/6 10:14:29  对本文有异议

以前为了防止前端密码安全问题,都是对密码进行md5(password + salt)。
有些也会用别的加密方式,但还是会存在撞库,彩虹表等破解常规密码。
因此使用bcrypt加密是一个不错的选择,因为每次加密都会随机salt,每次加密结果都不一样,相对安全性更高些。

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

  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "golang.org/x/crypto/bcrypt"
  6. "net/http"
  7. )
  8. func main() {
  9. pass := flag.String("p", "admin", "check password")
  10. flag.Parse()
  11. password := []byte(*pass)
  12. http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
  13. w.Write(html)
  14. })
  15. http.HandleFunc("/users/login", func(w http.ResponseWriter, r *http.Request) {
  16. hashedPassword := r.FormValue("pass")
  17. fmt.Println(hashedPassword)
  18. err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), password)
  19. if err != nil {
  20. fmt.Fprintln(w, err)
  21. } else {
  22. fmt.Fprintln(w, "password ok")
  23. }
  24. })
  25. http.ListenAndServe(":8080", nil)
  26. }
  27. var html = []byte(`<!DOCTYPE html>
  28. <html>
  29. <head>
  30. <script type="text/javascript" src="https://cdn.jsdelivr.net/gh/dcodeIO/bcrypt.js/dist/bcrypt.min.js"></script>
  31. <script type="text/javascript" src="https://cdn.jsdelivr.net/gh/jquery/jquery@3.2.1/dist/jquery.min.js"></script>
  32. </head>
  33. <body>
  34. <p>密码: <input id="pass" type="password" name="pass"/></p>
  35. <button type="button" onclick="login()">提交</button>
  36. <script type="text/javascript">
  37. function login() {
  38. /* https://github.com/dcodeIO/bcrypt.js */
  39. var bcrypt = dcodeIO.bcrypt;
  40. /* 将密码加密提交 */
  41. $.post('/users/login',{pass: bcrypt.hashSync($('#pass').val(), 8)},
  42. function(result) {
  43. alert(result);
  44. }
  45. );
  46. }
  47. </script>
  48. </body>
  49. </html>`)

该方案实际还是有一个问题,就是前端加密传输的文本是无法解密的。服务器只能用正确的密码同前端传上去的密文进行相同的加密规则比较密文是否一致。
此时服务器要么存明文密码,要么对密码做非对称加密,因为服务器是需要明文密码。以前使用md5值hash时,服务器直接存hash后的字符串,因此是没有问题的。
服务器存明文会存在密码泄露的风险,对密码做非对称或对称加密都会对服务器造成一些性能损耗。而且最终密码是可破解的。
有想过一个方案就是,前端初始获取rsa公钥,密码使用公钥加密,服务器使用私钥解密,然后把密码进行hash与数据库里面的hash值比较。有些人觉得这是多此一举。
总之各个方案都有各个方案的优缺点吧。

原文链接:http://www.cnblogs.com/janbar/p/14607659.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号