英文:
How to use go to verify whether the plaintext password is the same as the salt md5 password?
问题
你想用Go语言实现ldap_salted_md5.verify这一步骤。以下是翻译的内容:
Python:
// 生成密码
ldap_salted_md5.hash("123456")
// 验证密码
ldap_salted_md5.verify("123456","{SMD5}991RjK3DQCT+ri/yxQB613Yuxdg=")
// 返回true
Shell:
// 生成密码
slappasswd -h {SMD5} -s "123456"
// 返回 {SMD5}ZmDHoIiZZG/weuCNkLj189sFoPM=
// 通过Python验证密码
ldap_salted_md5.verify("123456","{SMD5}ZmDHoIiZZG/weuCNkLj189sFoPM=")
// 返回True
我明白你想要用Go语言实现ldap_salted_md5.verify这一步骤。
英文:
Python:
# generate password
ldap_salted_md5.hash("123456")
# verify password
ldap_salted_md5.verify("123456","{SMD5}991RjK3DQCT+ri/yxQB613Yuxdg=")
# return true
shell:
# generate password
slappasswd -h {SMD5} -s "123456"
# return {SMD5}ZmDHoIiZZG/weuCNkLj189sFoPM=
# verify password by python
ldap_salted_md5.verify("123456","{SMD5}ZmDHoIiZZG/weuCNkLj189sFoPM=")
# return True
I want to use go to implement this step of ldap_salted_md5.verify
答案1
得分: 0
saltPassword := strings.Replace(user.Password, "{SMD5}", "", -1)
decodeSaltPassword, _ := base64.StdEncoding.DecodeString(saltPassword)
checksum := decodeSaltPassword[0:16]
salt := decodeSaltPassword[16:]
md5Ctx := md5.New()
md5Ctx.Write([]byte(bindSimplePw))
md5Ctx.Write(salt)
cipherStr := md5Ctx.Sum(nil)
if !bytes.Equal(checksum, cipherStr) {
return ldap.LDAPResultInvalidCredentials, nil
}
以上代码是一个Go语言的代码片段,它执行了一些密码验证的操作。具体的步骤如下:
- 将用户的密码中的"{SMD5}"替换为空字符串,得到saltPassword。
- 使用base64解码saltPassword,得到decodeSaltPassword。
- 从decodeSaltPassword中取出前16个字节作为checksum,后面的字节作为salt。
- 创建一个md5的上下文对象md5Ctx。
- 将bindSimplePw转换为字节数组后写入md5Ctx。
- 将salt写入md5Ctx。
- 计算md5的哈希值,得到cipherStr。
- 如果checksum和cipherStr不相等,则返回ldap.LDAPResultInvalidCredentials,否则继续执行其他操作。
这段代码的作用是验证用户输入的密码是否正确。
英文:
saltPassword := strings.Replace(user.Password, "{SMD5}", "", -1)
decodeSaltPassword, _ := base64.StdEncoding.DecodeString(saltPassword)
checksum := decodeSaltPassword[0:16]
salt := decodeSaltPassword[16:]
md5Ctx := md5.New()
md5Ctx.Write([]byte(bindSimplePw))
md5Ctx.Write(salt)
cipherStr := md5Ctx.Sum(nil)
if !bytes.Equal(checksum, cipherStr) {
return ldap.LDAPResultInvalidCredentials, nil
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论