首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Keycloak自定义PasswordHashProvider,每个连接上的salt更改

基础概念

Keycloak是一个开源的身份和访问管理解决方案,它提供了用户认证、授权、单点登录(SSO)等功能。PasswordHashProvider是Keycloak中用于处理密码哈希的接口,允许开发者自定义密码的哈希算法和盐(salt)的生成方式。

相关优势

  1. 安全性:自定义PasswordHashProvider可以提高系统的安全性,因为你可以使用更强的哈希算法和更复杂的盐生成策略。
  2. 灵活性:根据具体需求,可以选择或实现最适合的哈希算法和盐生成方式。
  3. 兼容性:可以确保新系统与旧系统的密码兼容性,或者在迁移用户数据时保持密码的安全性。

类型

Keycloak支持多种类型的PasswordHashProvider,包括但不限于:

  • BCrypt:一种广泛使用的强哈希算法。
  • PBKDF2:基于密码的密钥派生函数2,可以配置迭代次数和盐的长度。
  • SCRYPT:一种更现代的哈希算法,旨在抵抗硬件加速攻击。

应用场景

  • 高安全性需求:在需要极高安全性的系统中,使用自定义的PasswordHashProvider可以确保密码存储的安全性。
  • 兼容性问题:在迁移用户数据或与其他系统集成时,可能需要自定义哈希算法以保持密码的兼容性。
  • 特定业务需求:根据业务需求,可能需要实现特定的哈希算法或盐生成策略。

自定义PasswordHashProvider示例

以下是一个简单的示例,展示如何在Keycloak中自定义一个PasswordHashProvider,并在每个连接上更改盐:

代码语言:txt
复制
import org.keycloak.models.PasswordPolicy;
import org.keycloak.models.RealmModel;
import org.keycloak.models.UserModel;
import org.keycloak.provider.ProviderConfigProperty;
import org.keycloak.storage.password.PasswordHashProvider;
import org.keycloak.storage.password.PasswordHashProviderFactory;
import org.keycloak.storage.password.PasswordHasher;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.SecureRandom;

public class CustomPasswordHashProvider implements PasswordHashProvider, PasswordHashProviderFactory {

    private static final String ID = "custom-password-hash-provider";
    private static final List<ProviderConfigProperty> CONFIG_PROPERTIES = new ArrayList<>();

    static {
        CONFIG_PROPERTIES.add(new ProviderConfigProperty("saltLength", "Salt Length", "integer", "16", "Salt length for the custom hash provider"));
    }

    @Override
    public void init(RealmModel realm) {
        // Initialization code here
    }

    @Override
    public void postInit(RealmModel realm) {
        // Post-initialization code here
    }

    @Override
    public String getId() {
        return ID;
    }

    @Override
    public boolean supportsHashType(String hashType) {
        return true; // Support all hash types
    }

    @Override
    public PasswordHasher getPasswordHasher() {
        return new PasswordHasher() {
            private final SecureRandom random = new SecureRandom();

            @Override
            public String hash(String password) {
                byte[] salt = new byte[Integer.parseInt(getConfig().getProperty("saltLength", "16"))];
                random.nextBytes(salt);
                // Implement your custom hashing algorithm here
                return "customHash(" + new String(salt) + "," + password + ")";
            }

            @Override
            public boolean verify(String rawPassword, String hashedPassword) {
                // Implement verification logic here
                return hashedPassword.equals(hash(rawPassword));
            }

            @Override
            public boolean needsRehash(String hashedPassword) {
                return false; // Always rehash if needed
            }
        };
    }

    @Override
    public void close() {
        // Cleanup code here
    }

    @Override
    public String getDisplayType() {
        return "Custom Password Hash Provider";
    }

    @Override
    public String getHelpText() {
        return "A custom password hash provider that changes the salt on each connection.";
    }

    @Override
    public List<ProviderConfigProperty> getConfigProperties() {
        return CONFIG_PROPERTIES;
    }

    @Override
    public Map<String, String> getDefaultConfig() {
        return Map.of("saltLength", "16");
    }
}

解决常见问题

为什么每个连接上的salt需要更改?

  • 安全性:每次连接使用不同的盐可以防止彩虹表攻击,因为彩虹表是基于固定盐生成的。
  • 随机性:使用随机生成的盐可以增加密码的复杂性,使得破解难度大大增加。

如何解决自定义PasswordHashProvider的问题?

  1. 实现逻辑:确保自定义的哈希算法和盐生成逻辑正确无误。
  2. 测试:在部署之前,进行充分的单元测试和集成测试,确保自定义的PasswordHashProvider能够正常工作。
  3. 配置:在Keycloak的配置文件中正确配置自定义的PasswordHashProvider,并确保其ID和其他属性设置正确。

参考链接

通过以上步骤和示例代码,你可以在Keycloak中实现一个自定义的PasswordHashProvider,并在每个连接上更改盐,从而提高系统的安全性和灵活性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

开源认证授权管理平台Keycloak初体验

上一篇文章简单介绍了Keycloak,反响不错。看来大家都对这个东西感兴趣,今天就来进一步体验Keycloak,让我们对它有一个直观认识,然后逐步深入,把它设计理念和概念各个击破。...Master域管理职能示意图 登入Masterrealm创建一个自定义域felord.cn。 ? 创建自定义域 User User是能够登录到应用系统实体,其实可以理解为账户。...接下来在我上面的自定义域felord.cn中新建一个用户,步骤为: 菜单栏找到管理->用户,然后打开添加用户。 键入唯一必填项用户名(username)。...此密码是临时,用户将需要在第一次登录时更改它。如果您更喜欢创建永久密码,请将临时开关切换到关闭并单击设置密码。...不过由于篇幅限制没有完全去梳理一些概念,不过学习都是循序渐进,急不得。自定义realm和用户都建好了,下一篇我将尝试用Keycloack来保护Spring Boot应用。

4.8K30

开源身份认证神器:KeyCloak

默认邮件模板详见 $KEYCLOAK_PATH/themes/base/email/html ,是用Freemarker写。我们也可以自定义邮件模板,详见“主题定制”一节。...这样登录页面就会变成类似下图: 主题定制 Keycloak自带届满稍微有那么一点丑陋,但Keycloak允许我们自定义主题—— 开发好主题后,将主题目录复制到$KEYCLOAK_PATH/themes...对于基于RESTfulresource server,该信息通常在security token中携带,通常作为bearer token,连同对服务器每个请求一起发送。...依靠会话来验证用户Web应用程序通常将该信息存储在用户会话中,并从那里为每个请求进行检索。...它提供了灵活性,并有助于: 减少代码重构和权限管理成本 支持更灵活安全模式,帮助您轻松适应安全需求变化 在运行时进行更改;应用程序只关心受保护resource和scope,而无需关心它们如何受到保护

5.9K20
  • 强大而灵活身份验证和授权服务

    、请求 URI 等 可以对每个规则定制使用单因子还是双因子认证 对于仅有单因子策略保护端点支持基本认证 keycloak/keycloak[2] Stars: 17.0k License: Apache...-2.0 demo of keycloak/keycloak Keycloak 是一款开源身份和访问管理解决方案,适用于现代应用程序和服务。...以下是 Keycloak 主要功能: 身份验证与授权:Keycloak 提供了强大而灵活身份验证和授权机制,可以轻松集成到各种应用程序中。...用户管理与认证流程定制化:Keycloak 允许管理员对用户进行有效管理,并提供自定义认证流程以满足特定业务需求。...支持自定义 State 缓存和 OAuth 平台,更容易适配自己 OAuth 服务。 可以选择自定义 Http 实现工具,并且支持更完善授权体系。

    56110

    Saltstack配置管理(State状态模块)

    Saltstack配置管理---State状态模块 Salt通过State模块来进行文件管理;通过YAML语法来描述,后缀是.sls文件 。...1.1 了解YAML remove vim: pkg.removed: - name: vim  注意: 带有ID和每个函数调用行都以冒号(:)结束。 每个函数调用在ID下面缩进两个空格。...参数作为列表传递给每个函数。 每行包含函数参数行都以两个空格缩进开头,然后是字符,然后是一个额外空格。 如果参数采用单个值,则名称和值位于由冒号和空格分隔同一行中。...建议将同一类放置在一个目录下,以“.”方式进行调用 image.png salt'Saltstack02*'state.sls web.apache image.png 6、使用salt高级状态使不同主机应用不同配置...查看一下salt如何定义高级状态 image.png 以上可知状态系统可以使用一个“top”file入口文件,放置在base环境目录下,命名为top.sls,默认不建议更改其内容。

    87320

    ansible puppet saltstack三款自动化运维工具对比!

    然后,需要对配置文件进行更改,好让模块适合所需任务;应接到指令客户端与主服务器联系时,会更改配置文件,或者客户端通过立即触发更改配置文件推送(push)来进行更改。   ...安装完毕后,需要管理节点被添加到Ansible配置环境,SSH授权密钥被附加到每个节点上,这与运行Ansible用户有关。...可以用几乎任何一种语言来编写自定义Ansible模块,只要模块输出是有效JSON。   ...比如说,只要使用一个CLI命令,你就可以向运行某个内核版本每个客户端发送命令。   与Puppet、Chef和Ansible一样,Salt也提供了大量模块,以处理特定软件、操作系统和云服务。...自定义模块可以用Python或PyDSL来编写。除了Unix管理外,Salt的确提供Windows管理功能,但它还是更擅长管理Unix和Linux系统。

    6.8K21

    CAS单点登录-自定义认证登录策略(五)

    自定义策略主要通过现实更改CAS配置,通过AuthenticationHandler在CAS中设计和注册自定义身份验证策略,拦截数据源达到目的。...主要分为下面三个步骤: 设计自己认证处理数据程序 注册认证拦截器到CAS认证引擎中 更改认证配置到CAS中 首先我们还是添加需要依赖库: <!...特定字符串是程序代码中固定salt每个密码单独随机,一般给用户表加一个字段单独存储,比较麻烦。...BCrypt算法将salt随机并混入最终加密后密码,验证时也无需单独提供之前salt,从而无需单独处理salt问题。 补充说明:即使不同用户注册时输入相同密码,存入数据库密文密码也会不同。...官方实例有一个坑,给出是5.2.x版本以前例子,5.3.x版本后jar包更改了,而且有个地方有坑,在5.2.x版本前可以,新5.3.x是不行

    1.4K31

    Spring Boot 从入门到实践系列教程(1)- 课程目录

    - 引导程序 Spring Boot Annotations Spring Boot Starters简介 Spring Boot 执行器 快速构建一个Spring Boot Web应用程序 如何更改...Spring Boot中默认端口 修改Spring Boot上下文路径 Spring Boot中@ConfigurationProperties指南 Spring Boot自动扩展属性 Spring...使用Spring Boot创建Fat Jar应用程序 Spring Boot 中自定义信息 SpringBootServletInitializer快速入门 Spring Boot Exit Code...关闭Spring Boot应用程序 Spring Boot中命令行参数 使用自定义父级进行Spring Boot依赖关系管理 使用Swagger生成Spring Boot REST客户端 在Spring...Boot CLI简介 Spring Boot 应用即服务 Spring Boot Gradle插件 将Spring Boot App部署到Azure ---- Spring Boot - 扩展库 使用Keycloak

    1K30

    (译)Kubernetes 单点登录详解

    以及 KEYCLOAK_PASSWORD 设置了 keycloak 用户名和密码,我们将会用这个信息来访问 Keycloak 控制台。...一般解决办法,要么是使用 KUBECONFIG 环境变量指定配置文件,其中包含了硬编码凭据;要么就是使用自定义脚本来包装 AWS 或者 GCP 客户端。...然而为每个用户创建一个 Cluster Role Binding 是个很麻烦事情。 要解决这个问题就要靠群组,我们会对 OIDC 实现进行配置,使其感知到 Keycloak 群组。..."Administrators", "KubernetesAdmins" ], ... } 我们可以创建一个 Cluster Role Binding,让每个...KubernetesAdmin 中每个成员都有 cluster-admin 访问能力: apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding

    6K50

    DevOps 自动化运维工具选择

    Puppet呈现了数据中心协调全貌,几乎涵盖每一个运行系统,为各大操作系统提供了深入工具。初始设置比较简单,只需要在需要加以管理每个系统上安装主服务器和客户端代理软件。...然后,需要对配置文件进行更改,好让模块适合所需任务;应接到指令客户端与主服务器联系时,会更改配置文件,或者客户端通过立即触发更改配置文件推送(push)来进行更改。...安装完毕后,需要管理节点被添加到Ansible配置环境,SSH授权密钥被附加到每个节点上,这与运行Ansible用户有关。...可以用几乎任何一种语言来编写自定义Ansible模块,只要模块输出是有效JSON。 AnsibleWeb用户界面以AnsibleWorks AWX形式出现,但AWX与CLI并不直接联系在一起。...Salt是四款工具中最漂亮最稳健;与Ansible一样,它也会博得系统管理员芳心。Salt拥有高扩展性和强大功能,唯一软肋就是Web用户界面。

    2.5K30

    在 Kubernetes 中使用 Keycloak OIDC Provider 对用户进行身份验证

    API Server 作为 Kubernetes 网关,是用户访问和管理资源对象入口。对于每个访问请求, API Server 都需要对访问者合法性进行检查,包括身份验证、权限验证等等。...3 Keycloak 介绍 本文将会使用 Keycloak 作为 OpenID Connect 认证服务器。...keycloak 1 是一个开源、面向现代应用和服务 IAM(身份认证和访问控制)解决方案。...5 部署 Keycloak 服务器 Kubernetes 要求使用 OpenID Connect 认证服务必须是 HTTPS 加密,运行以下脚本生成 Keycloak 服务器私钥和证书签名请求,并使用...要想让 Kubernetes 认识 Keycloak用户,就需要在 Keycloak 返回 id_token 中携带表明用户身份信息(例如用户名、组、邮箱等等),Keycloak 支持自定义声明并将它们添加到

    6.5K20

    15个私有云上 DevOps 开源工具

    Puppet 可以使用独立模式或者 服务器/客户端 模式。Puppet 客户端(agent)应该安装要配置每个节点或VM上。...Puppet 客户端 通过一个名为 Facter 工具收集 Puppet 服务器上配置更改要求,并生成特定与服务器目录,其应用配置更改都会记录下来。...模块可以用标准脚本语言(Python,Bash,Ruby,等等)编写,这是一个很好做法,使每个模块幂等。...在后一种情况下,Salt 使用SSH连接到受管理节点/虚拟机。Salt 使用以Python编写执行模块,其中包含函数以定义配置任务。另外 Salt 支持 ad-hoc 命令。...由配置文件来自定义要配置系统,Cobbler 支持多个配置文件。一旦节点被配置,Cobbler 应确保该节点被引导到预配置操作系统而不是PXE。

    2.4K50

    EMQX基础功能

    Overview Overview 作为 Dashboard 默认展示页面,提供了 EMQ X 当前节点详细信息和集群其他节点关键信息,以帮助用户快速掌握每个节点状态。...连接数据源、进行认证逻辑通过插件实现每个插件对应一种认证方式,使用前需要启用相应插件。...启用哈希方法时,用户可以为每个客户端都指定一个 salt(盐)并配置加盐规则,数据库中存储密码是按照。加盐规则与哈希方法处理后密文。...前缀:使用 sha256 加密 salt + 密码 拼接字符串 auth.mysql.password_hash = salt,sha256 ## salt 后缀:使用 sha256 加密 密码...+ salt 拼接字符串 auth.mysql.password_hash = sha256,salt ## pbkdf2 with macfun iterations dklen ## macfun

    6K20

    Spring Security 之密码存储

    由于散列是一种单向形式,在给定散列情况下很难猜测出密码,因此不值得费尽心思找出系统中每个密码。...为了降低彩虹表有效性,建议开发者使用加盐(salt)密码,盐(salt)为每个用户密码生成一个随机数,将salt和用户密码通过哈希函数计算,得到唯一哈希值。...salt将以明文形式存储在用户密码中?,当用户认证时候,存储哈希值跟salt和用户密码哈希值进行比较。 在现代,我们意识到加密哈希(如SHA-256)不再安全。...原因是,使用目前硬件我们可以每秒执行数十亿次哈希计算,这意味着我们可以轻松地分别破解每个密码。...然而,这忽略了三个现实问题: 有许多应用程序使用旧密码编码,无法轻松迁移 密码存储最佳做法将再次更改 作为一个框架,Spring Security不能频繁进行更改 Spring Security引入了

    97630

    SaltStack常用模块介绍

    2.3.3 file.chgrp、file.chown和file.set_mode用法(前者是更改文件属组,中者是更改文件数属主属组,后者是更改文件或目录权限) 例子: # salt '*' file.chgrp.../tmp/1 test9 #将minion端/tmp/1文件更改用户组为test9,如果客户端有此用户组则返回None,没有此用户组则返回用户组不存在 # salt '*' file.chown...,d:天,h:小时, m:分钟,s:秒),大小大于10MB文件,并打印文件路径,大小,更改时间(可打印内容有:group:组名,md5:文件内容MD5摘要,mode:文件权限(以整数形式),mtime...,如果为空则会执行并返回True # salt '*' file.rename /opt/cs/ds /opt/cs/dss #更改/opt/cs目录下ds目录为dss目录 2.3.13 file.touch...(network.interface会网关子网掩码也显示) # salt 'agent1.salt' network.mod_hostname test1.salt #修改某一个minion主机名

    1.7K30
    领券