如何使用Go语言验证明文密码是否与盐值MD5密码相同?

huangapple go评论89阅读模式
英文:

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语言的代码片段,它执行了一些密码验证的操作。具体的步骤如下:

  1. 将用户的密码中的"{SMD5}"替换为空字符串,得到saltPassword。
  2. 使用base64解码saltPassword,得到decodeSaltPassword。
  3. 从decodeSaltPassword中取出前16个字节作为checksum,后面的字节作为salt。
  4. 创建一个md5的上下文对象md5Ctx。
  5. 将bindSimplePw转换为字节数组后写入md5Ctx。
  6. 将salt写入md5Ctx。
  7. 计算md5的哈希值,得到cipherStr。
  8. 如果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
		}

huangapple
  • 本文由 发表于 2022年10月28日 17:34:17
  • 转载请务必保留本文链接:https://go.coder-hub.com/74233350.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定