gpt4 book ai didi

Spring LDAP - 如何管理编码(SHA)密码

转载 作者:行者123 更新时间:2023-12-02 04:55:16 25 4
gpt4 key购买 nike

我想使用 Spring LDAP 及其对象目录映射 (ODM) 的概念来实现一个基本的用户存储库。

我的用户类非常简单:

@Entry(objectClasses = { "inetOrgPerson", "organizationalPerson", "person", "shadowAccount", "top" }, base = "ou=people")
public class User {
[...]

@Id
private Name dn;

@Attribute(name = "uid")
@DnAttribute(value = "uid")
private String username;

@Attribute(name = "cn")
private String fullName;

@Attribute(name = "givenName")
private String firstName;

@Attribute(name = "sn")
private String lastName;

@Attribute(name = "o")
private String organization;

@Attribute(name = "userPassword")
private String password;

// Getters & Setters
[...]
}

以及我的存储库的基本方法:

public User findByUid(String uid) {
return ldapTemplate.findOne(query().where("uid").is(uid), User.class);
}

public void update(User user) {
ldapTemplate.update(user);
}

除了密码属性之外,一切正常。例如,如果我仅更改用户名,则密码也会更改。

我想知道如何处理编码密码(使用 SHA - 安全哈希算法)。

我没有看到任何允许指定编码方法的注释。

我们必须手动处理吗?

最佳答案

简短版本

@Attribute(name = "userPassword", type = Type.BINARY)
private byte[] password;

是密码属性的正确定义。这是因为 LDAP 也将密码存储为二进制。

为了提供便捷的交互方式,您应该修改password的setter:

public void setPassword(String password) {
this.password = password.getBytes(StandardCharsets.UTF_8);
}

长版

问题在于您对 userPassword 的定义。它是一个java.lang.String。 Spring LDAP ODM Attribute 注解默认为 Type.STRING

您的 LDAP 将字符串作为字节数组获取,并检查它是否具有正确的前缀(在我们的示例中为 {SSHA})。如果不存在前缀,它将使用其配置的哈希算法对给定字符串进行哈希处理,并将其作为二进制存储在属性中。根本原因就在这里。您的属性定义不同。 LDAP 有一个二进制文件,你有一个字符串。

当您再次读取该条目并修改名字时,密码属性也会被读取。但是,由于它应该是对象中的字符串,Spring 将二进制数组转换为字符串。此转换是错误的,因为它创建了一个字符串。

例如

  • 您将 test 放入实体对象的密码字段中。

  • Spring 获取该字符串并将其未修改发送到 LDAP 服务器。

  • 服务器对字符串进行哈希处理并将其保存为 {SSHA}H97JD...

  • 您再次阅读该条目

  • spring 获取一个 byte[] ,其中包含表示存储值的 ASCII 数字

    [123、83、83、72、65、125、72、57、55、74、68、...]

  • 转换为字符串会产生以下结果:

    123,83,83,72,65,125,72,57,55,74,68,...

  • spring 在您的实体中将此字符串设置为密码值

  • 您修改了名字

  • spring再次获取密码字符串并将其按原样发送到服务器

  • 服务器前缀检查表明密码未经过哈希处理,并对字符串再次应用哈希算法,因为 123,83, 不以 {SSHA} 开头

  • 服务器再次更改密码。

关于Spring LDAP - 如何管理编码(SHA)密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25536341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com