• 关于

    python 加盐

    的搜索结果

问题

社区系统 Icarus 1.3.0

寒喵 2019-12-01 21:51:20 1292 浏览量 回答数 0

回答

package main import ( "crypto/sha256" "encoding/base64" "strconv" "crypto/hmac" "hash" "io" "net/http" "strings" "math/rand" "time" "fmt" ) // djnago 的实现细节请参考 Python 和 djnago 文档: // djnago.contrib.auth.hashers.make_password // djnago.utils.crypto import pbkdf2 // hashlib.sha256 // base64 func main() { http.HandleFunc("/djnagopwd", gendjnagopwd) http.ListenAndServe(":7070", nil) } func gendjnagopwd(rw http.ResponseWriter, req *http.Request){ req.ParseForm(); attempted := req.FormValue("attempted"); var temp = req.FormValue("salt"); var salt []byte if temp != ""{ salt = []byte (temp) // 盐,是一个随机字符串,每一个用户都不一样 }else{ salt = []byte(genSalt()) } fmt.Println("-----------------salt::::: "+salt+" ----------------"); pwd := []byte(attempted) // 用户设置的原始密码 iterations := 15000 // 加密算法的迭代次数,15000 次 digest := sha256.New // digest 算法,使用 sha256 // 第一步:使用 pbkdf2 算法加密 dk := Key(pwd, salt, iterations, 32, digest) // 第二步:Base64 str := base64.StdEncoding.EncodeToString(dk) // 第三步:组合加密算法、迭代次数、盐、密码和分割符号 "$" io.WriteString(rw, "pbkdf2_sha256" + "$" + strconv.FormatInt(int64(iterations), 10) + "$" + string(salt) + "$" + str); } func Key(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { prf := hmac.New(h, password) hashLen := prf.Size() numBlocks := (keyLen + hashLen - 1) / hashLen var buf [4]byte dk := make([]byte, 0, numBlocks*hashLen) U := make([]byte, hashLen) for block := 1; block <= numBlocks; block++ { // N.B.: || means concatenation, ^ means XOR // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter // U_1 = PRF(password, salt || uint(i)) prf.Reset() prf.Write(salt) buf[0] = byte(block >> 24) buf[1] = byte(block >> 16) buf[2] = byte(block >> 8) buf[3] = byte(block) prf.Write(buf[:4]) dk = prf.Sum(dk) T := dk[len(dk)-hashLen:] copy(U, T) // U_n = PRF(password, U_(n-1)) for n := 2; n <= iter; n++ { prf.Reset() prf.Write(U) U = U[:0] U = prf.Sum(U) for x := range U { T[x] ^= U[x] } } } return dk[:keyLen] } /** *生成随机字符 **/ func genSalt() string { length := 12 rand.Seed(time.Now().UnixNano()) rs := make([]string, length) for start := 0; start < length; start++ { t := rand.Intn(3) if t == 0 { rs = append(rs, strconv.Itoa(rand.Intn(10))) } else if t == 1 { rs = append(rs, string(rand.Intn(26)+65)) } else { rs = append(rs, string(rand.Intn(26)+97)) } } return strings.Join(rs, "") } 已解决,网上找了几个语言的pbkdf2_sha256算法,计算出的结果都和python不一样。 试过php/java/nodejs/golang,最后只有golang结果和python一致,无奈只有用golang生成密码,java调用golang的http服务,下面贴出代码: ######亲测可用

kun坤 2020-06-08 09:45:50 0 浏览量 回答数 0

回答

"<pre class=""brush:cpp; toolbar: true; auto-links: false;"">package main import ( "crypto/sha256" "encoding/base64" "strconv" "crypto/hmac" "hash" "io" "net/http" "strings" "math/rand" "time" "fmt" ) // djnago 的实现细节请参考 Python 和 djnago 文档: // djnago.contrib.auth.hashers.make_password // djnago.utils.crypto import pbkdf2 // hashlib.sha256 // base64 func main() { http.HandleFunc("/djnagopwd", gendjnagopwd) http.ListenAndServe(":7070", nil) } func gendjnagopwd(rw http.ResponseWriter, req *http.Request){ req.ParseForm(); attempted := req.FormValue("attempted"); var temp = req.FormValue("salt"); var salt []byte if temp != ""{ salt = []byte (temp) // 盐,是一个随机字符串,每一个用户都不一样 }else{ salt = []byte(genSalt()) } fmt.Println("-----------------salt::::: "+salt+" ----------------"); pwd := []byte(attempted) // 用户设置的原始密码 iterations := 15000 // 加密算法的迭代次数,15000 次 digest := sha256.New // digest 算法,使用 sha256 // 第一步:使用 pbkdf2 算法加密 dk := Key(pwd, salt, iterations, 32, digest) // 第二步:Base64 str := base64.StdEncoding.EncodeToString(dk) // 第三步:组合加密算法、迭代次数、盐、密码和分割符号 "$" io.WriteString(rw, "pbkdf2_sha256" + "$" + strconv.FormatInt(int64(iterations), 10) + "$" + string(salt) + "$" + str); } func Key(password, salt []byte, iter, keyLen int, h func() hash.Hash) []byte { prf := hmac.New(h, password) hashLen := prf.Size() numBlocks := (keyLen + hashLen - 1) / hashLen var buf [4]byte dk := make([]byte, 0, numBlocks*hashLen) U := make([]byte, hashLen) for block := 1; block <= numBlocks; block++ { // N.B.: || means concatenation, ^ means XOR // for each block T_i = U_1 ^ U_2 ^ ... ^ U_iter // U_1 = PRF(password, salt || uint(i)) prf.Reset() prf.Write(salt) buf[0] = byte(block >> 24) buf[1] = byte(block >> 16) buf[2] = byte(block >> 8) buf[3] = byte(block) prf.Write(buf[:4]) dk = prf.Sum(dk) T := dk[len(dk)-hashLen:] copy(U, T) // U_n = PRF(password, U_(n-1)) for n := 2; n <= iter; n++ { prf.Reset() prf.Write(U) U = U[:0] U = prf.Sum(U) for x := range U { T[x] ^= U[x] } } } return dk[:keyLen] } /** *生成随机字符 **/ func genSalt() string { length := 12 rand.Seed(time.Now().UnixNano()) rs := make([]string, length) for start := 0; start < length; start++ { t := rand.Intn(3) if t == 0 { rs = append(rs, strconv.Itoa(rand.Intn(10))) } else if t == 1 { rs = append(rs, string(rand.Intn(26)+65)) } else { rs = append(rs, string(rand.Intn(26)+97)) } } return strings.Join(rs, "") } 已解决,网上找了几个语言的pbkdf2_sha256算法,计算出的结果都和python不一样。 试过php/java/nodejs/golang,最后只有golang结果和python一致,无奈只有用golang生成密码,java调用golang的http服务,下面贴出代码: ###### 亲测可用"

montos 2020-06-04 14:36:15 0 浏览量 回答数 0

阿里云试用中心,为您提供0门槛上云实践机会!

0元试用32+款产品,最高免费12个月!拨打95187-1,咨询专业上云建议!

问题

Java安全编码:糟糕的在线建议和令人困惑的APIs

移动安全 2019-12-01 21:31:32 1891 浏览量 回答数 0

问题

程序员报错QA大分享(1)

问问小秘 2020-06-18 15:46:14 1684 浏览量 回答数 2
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 企业建站模板