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

2023-12-10

我想使用 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 也将密码存储为二进制。

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

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

长版

问题是你的定义userPassword。它是一个java.lang.String。 Spring LDAP ODM 属性注释默认为Type.STRING.

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

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

e.g.

  • you put test在实体对象的密码字段中。

  • Spring 获取字符串并发送它未修改的到 LDAP 服务器。

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

  • 您再次阅读该条目

  • 春天得到一个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}

  • 服务器再次更改密码。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring LDAP - 如何管理编码(SHA)密码 的相关文章

随机推荐

  • Python 计算字母出现次数

    我正在尝试计算字母的出现次数并打印它们 这是我到目前为止所拥有的 def histogram L d for x in L for letter in x if letter in d d letter 1 else d letter 1
  • UnexpectedRollbackException - JTA 事务意外回滚

    当我运行下面的代码时 我得到 UnexpectedRollbackException 而不是 ArrayIndexOutOfBoundsException 环境 Weblogic Spring Hibernate JTA 和 EJB Cod
  • 使用扩展方法验证域模型

    我一直在研究使用服务层在将域模型保存到数据库之前验证它们 我找到了下面的例子使用扩展方法来验证我的模型 但想知道这样做是否有任何具体的缺点 我没有看到验证 除了数据注释 提到那么多 我正在考虑实施以下内容 public class FooS
  • .rar、.zip 文件 MIME 类型

    我正在开发一个简单的 php 上传脚本 用户只能上传 ZIP 和 RAR 文件 我应该使用哪些 MIME 类型来检查 FILES x type 请提供完整列表 自由和平组织 Kiyarash 和 Sam Vloeberghs 的回答 rar
  • VBA将html表格数据复制到excel工作表

    我需要一个可以将本地 html 表数据提取到 Excel 工作表的 VBA 脚本 我有一些代码 在网络上的某个地方找到 可以使用 URL 链接来工作 但我想要的是能够使用本地存储的 html 文件来完成此操作 错误是我得到的是 应用程序定义
  • 如何在 python 中从特定的 ISO 格式正确解析日期

    我连接到数据库上的一个表 其中有两列带日期 我可以毫无问题地解析具有如下格式的值的列 2017 11 03但我找不到一种方法来解析日期格式如下的另一列 2017 10 03 05 06 52 840 02 00 我的尝试如果我通过解析单个值
  • OS X - 真正的“按需”特权帮助工具

    我的应用程序需要将文件写入文件系统上的受限位置 为此 我使用以 root 身份运行的辅助工具 一切正常 遵循这个例子 我的辅助工具已正确安装并运行 我使用此解决方案能够 唤醒 辅助工具 否则它在初始加载后不会启动多次 辅助工具正在等待来自主
  • 字符串到数字转换的性能问题

    我有空格分隔的字符串 其中包含中间的数字 例如 abc123 ws32wd3 y3tg43 5tga89 a1a 我必须解析字符串以获取每个标记中的数字 然后总结从标记中提取的所有数字 我写了下面的代码 但我认为 如果有很大的字符串 那么可
  • python2.6.6 将 apache 日志时间戳转换为自纪元以来的秒数(unix 风格)

    由于我完全迷失在 stackoverflow 上找到的数十种进行时间戳转换的方法中 所以我将在这里问完整的问题 从 apache 日志转换此时间戳 采用 CEST 时区 30 Aug 2015 05 13 53 0200 进入这个 1440
  • 如何将子 XML 元素与 XSD 中的文本混合

    考虑以下 XML
  • 如何测试与 db2 数据库的连接

    我需要测试与 db2 数据库的连接 对于 Oracle 数据库 我会执行 select from Dual 来执行此操作 但 Dual 是 Oracle 特有的 db2有类似的规范测试sql语句吗 SELECT 1 FROM SYSIBM
  • 联合或结构是否允许从未初始化的实例进行赋值?

    这个问题是关于将未初始化的自动变量分配给另一个相同类型的变量的定义或其他方面 Consider typedef struct int s1 int s2 Foo typedef union int u1 Foo u2 Bar int mai
  • Javascript 将宽度和高度转换为字体大小

    我不确定这个问题是否已经被提出和回答 但我还没有找到任何相关结果 我想知道是否可以计算特定尺寸 宽度 高度 并将其转换为 字体大小 例如 我有 var textWidth 150 var textHeight 30 我想从这些尺寸 像素 中
  • 为什么 TypedReference.MakeTypedReference 如此受限?

    我终于明白了它的用法TypedReference MakeTypedReference方法 但为什么论据如此有限 底层私有InternalMakeTypedReference void result object target IntPtr
  • Spring data JPA @Query 与命名列的映射

    我将 Spring Boot 1 5 和 spring data JPA 与 MySQL 结合使用 我尝试在单个表上运行简单的计数查询 但找不到比这更好的方法来映射查询结果 存储库 public interface VehicleRepos
  • 查找字符串中出现次数最多的字符?

    例如 我有一个字符串 abbbbccd b出现次数最多 使用 C 时 处理此问题的最简单方法是将每个字符插入到map lt gt 我必须在 C 中做同样的事情吗 有没有一种使用 LINQ 的优雅方法 input GroupBy x gt x
  • 对角积乘法

    我想要每组日期的对角线乘法 主要数据集 date Bucket D 1 31 2013 bkt 0 NA 1 31 2013 bkt 1 10 20 NA 1 31 2013 bkt 2 20 30 NA 1 31 2013 bkt 3 3
  • jQuery:如果所有子div的html为空,则隐藏父div

    我有一个父 div 包含三个子 div 我想检查子 div 以查看它们是否为空 如果它们都为空 我想隐藏父 div 以便背景在我的设计中消失 div class main div class tot1 div div class tot2
  • 矩形之间的二维碰撞检测

    我正在为我的游戏编写碰撞检测引擎 但遇到一些问题 事实上 由于我有几个固定的矩形和一个移动的 玩家 我需要知道固定矩形的哪一侧首先被玩家碰撞 以正确地替换他 固定矩形不在网格中 因此它们可以放置在地图上的任何位置 并且可以具有不同的大小 它
  • Spring LDAP - 如何管理编码(SHA)密码

    我想使用 Spring LDAP 及其对象目录映射 ODM 的概念来实现一个基本的用户存储库 我的用户类非常简单 Entry objectClasses inetOrgPerson organizationalPerson person s