数据库安全第一关:用户密码存储与认证机制的深度拆解
数据库安全第一关用户密码存储与认证机制的深度拆解从一个让人困惑的报错说起几个月前团队里的一位运维同事遇到了一个让他百思不得其解的问题“新建了一个用户密码明明输对了为什么就是连不上”他在KingbaseES里执行了CREATE USER app_user WITH PASSWORD App2026然后在客户端用这个用户名和密码去连接结果反复提示认证失败。他确认了三次密码没有输错确认了用户没有被锁定确认了网络是通的——一切都正常但就是连不上。我让他执行了下面这条查询SELECTrolname,rolpasswordFROMsys_authidWHERErolnameapp_user;然后又看了s altsys_hba.conf里的配置。问题很快就定位了用户密码存储用的是默认的scram-sha-256算法但s altsys_hba.conf里配置的认证方式是md5。存储算法和认证方法不匹配导致虽然密码正确但认证流程走不通。这个问题让我意识到很多数据库使用者对“密码怎么存”和“密码怎么验”这两个概念是混淆的。这篇文章就来彻底拆解一下这两套机制。第一章两个容易混淆的核心概念1.1 存储 vs 认证各管一摊先看一张对比表维度密码存储加密口令认证解决什么问题数据文件泄露后密码原文是否安全网络传输时口令会不会被窃取控制参数password_encryptionsys_hba.conf中的METHOD默认值scram-sha-256scram-sha-256什么时候起作用创建/修改用户密码时客户端连接数据库时打个比方把密码写进保险箱的方式门卫核对身份的方式这两个概念之所以容易被混淆是因为它们确实有关联——认证方法必须兼容存储算法否则就会像开头那位同事一样密码正确却登录失败。但它们的职责是分离的一个管“存”一个管“验”。1.2 密码到底存在哪里所有用户的密码信息都存储在sys_authid系统表中-- 查看用户密码存储信息SELECTrolname,rolpassword,rolvaliduntilFROMsys_authidWHERErolnameIN(system,fin_app);输出示例rolname | rolpassword ---------------------------------------------------------------------------------- system | SCRAM-SHA-256$4096:SBfzuqMqQjEWP/wn8TlwQ$WeOQ2yOLEGvYp9v0DS5F... fin_app | SCRAM-SHA-256$4096:kOPAYRYx2elBrNaeCo18BQ$4xV0YdFPq7Uq2UvGqJ2H...rolpassword这个字段存储的不是密码原文而是经过哈希算法处理后的值。哈希算法是单向的——从哈希值无法还原出原始密码这正是密码存储安全的基础。1.3 准备测试用户为方便后续演示先创建几个测试用户-- 创建演示数据库CREATEDATABASEdemodb;-- 创建四个测试用户CREATEUSERfin_appWITHPASSWORDSecurePass!2026;-- 金融应用CREATEUSERteaching_assistantWITHPASSWORDKingbase_123;-- 教学应用CREATEUSERlegacy_mercuryWITHPASSWORDMercury2026;-- 遗留系统CREATEUSERgov_financeWITHPASSWORDGov2026;-- 政务系统这四个用户会贯穿全文分别对应不同的存储算法和认证方式组合。第二章密码存储——数据文件里的安全防线2.1 支持的存储算法KingbaseES支持多种密码存储算法通过password_encryption参数控制。通用算法参数值算法类型存储格式示例安全等级scram-sha-256SCRAM SHA-256SCRAM-SHA-256$4096:盐$密钥高md5MD5哈希md5 32位十六进制哈希中国密算法V9R1版本支持参数值算法类型存储格式示例安全等级sm3国密SM3sm3 64位十六进制哈希高scram-sm3SCRAM SM3SCRAM-SM3$...高2.2 查看当前用户的存储格式SELECTrolnameAS用户名,CASEWHENrolpasswordISNULLTHEN未设置密码WHENrolpasswordLIKESCRAM-SHA-256$%THENSCRAM-SHA-256WHENrolpasswordLIKESCRAM-SM3$%THENSCRAM-SM3WHENrolpasswordLIKEmd5%THENMD5WHENrolpasswordLIKEsm3%THENSM3ELSE未知格式ENDAS存储算法FROMsys_authidWHERErolnameIN(fin_app,teaching_assistant,legacy_mercury,gov_finance);默认情况下所有用户的存储算法都是scram-sha-256。2.3 修改存储算法两步法这里有一个常见误区很多人以为执行了ALTER ROLE ... SET password_encryption md5就算改完了。实际上这只改了参数已存在的密码并不会自动转换格式。正确的做法是两步-- 第一步为用户设置默认存储算法ALTERROLE legacy_mercurySETpassword_encryptionmd5;-- 第二步重置密码这一步不能少-- 注意当前会话必须先设置参数再重置密码SETpassword_encryptionmd5;ALTERUSERlegacy_mercury PASSWORDMercury2026;如果不做第二步密码仍然是旧的存储格式。这一点在运维中经常被忽略导致明明改了配置密码格式却没变。2.4 参数优先级password_encryption可以在多个层级设置优先级从高到低会话级SET password_encryption sm3;用户级ALTER ROLE fin_app SET password_encryption sm3;数据库级ALTER DATABASE demodb SET password_encryption scram-sm3;实例级ALTER SYSTEM SET password_encryption scram-sm3;查看参数是否需要重启SELECTname,context,pending_restartFROMsys_settingsWHEREnamepassword_encryption;context user表示可以在各层级动态设置pending_restart f表示修改后无需重启数据库。第三章口令认证——连接时的身份核验配置好密码存储后还需要在sys_hba.conf中指定认证方法客户端才能成功连接。3.1 认证方法一览认证方法安全等级说明适用版本scram-sha-256高SCRAM挑战-响应抗嗅探、抗重放所有版本scram-sm3高SCRAM SM3国密V9R1sm3高国密SM3哈希认证V9R1md5中兼容老客户端所有版本password极低明文密码传输仅限测试3.2 sys_hba.conf配置示例根据前面设置的存储算法配置对应的认证方法# TYPE DATABASE USER ADDRESS METHOD # ----------------------------------------------------------------------- local all system peer host all fin_app 192.168.126.0/24 scram-sha-256 host all teaching_assistant 192.168.126.0/24 scram-sha-256 host all legacy_mercury 192.168.126.0/24 md5 host all gov_finance 192.168.126.0/24 sm3配置完成后需要重载才能生效sys_ctl reload-D$KINGBASE_DATA或者从SQL中执行SELECTsys_reload_conf();3.3 验证当前生效的认证规则SELECTtype,user_name,address,auth_methodFROMsys_hba_file_rulesWHEREuser_name!{system}::text[];3.4 两种认证流程的差异SCRAM-SHA-256流程安全客户端和服务器之间通过挑战-响应机制验证身份。网络传输的不是密码本身也不是简单的哈希值而是经过加盐、多次迭代计算后的证明。每次认证使用不同的随机数可以防止重放攻击。SM3流程相对简单客户端直接计算密码的SM3哈希值发送给服务器验证。流程更简单但缺乏挑战-响应机制不具备抗重放能力。这就是为什么国密合规场景中更推荐使用scram-sm3而不是sm3——前者在满足国密要求的同时提供了更高的安全性。第四章当存储遇上认证——兼容性测试理解了存储和认证各自的原理接下来看看它们如何协同工作——以及不匹配时会发生什么。4.1 当前配置状态经过前面的配置四个测试用户的状态如下用户存储算法认证方法预期结果fin_appSCRAM-SHA-256scram-sha-256成功teaching_assistantSCRAM-SHA-256scram-sha-256成功legacy_mercurymd5md5成功gov_financesm3sm3成功4.2 测试一全部改用MD5认证临时修改sys_hba.conf将所有用户的认证方法改为md5重载配置后测试ksql-Ulegacy_mercury-ddemodb-h192.168.126.16# 成功ksql-Ufin_app-ddemodb-h192.168.126.16# 成功ksql-Ugov_finance-ddemodb-h192.168.126.16# 成功结论MD5认证方式兼容所有存储算法。但它安全性较低只适合遗留系统过渡。4.3 测试二全部改用SCRAM-SHA-256认证将所有用户的认证方法改为scram-sha-256ksql-Ulegacy_mercury-ddemodb-h192.168.126.16# 失败ksql-Ufin_app-ddemodb-h192.168.126.16# 成功ksql-Ugov_finance-ddemodb-h192.168.126.16# 失败结论SCRAM-SHA-256只兼容同族算法即存储格式也是scram-sha-256的用户。4.4 测试三全部改用SM3认证将所有用户的认证方法改为sm3ksql-Ulegacy_mercury-ddemodb-h192.168.126.16# 失败ksql-Ufin_app-ddemodb-h192.168.126.16# 失败ksql-Ugov_finance-ddemodb-h192.168.126.16# 成功结论SM3认证只兼容SM3存储算法。4.5 兼容性矩阵认证方法 \ 存储算法MD5SCRAM-SHA-256SM3md5✅✅✅scram-sha-256❌✅❌sm3❌❌✅核心规律MD5认证可以验证所有存储算法但安全性低同族算法的存储和认证完全兼容通用算法与国密算法互不兼容第五章实际运维中的场景与排查5.1 场景一创建新用户标准流程-- 第一步确认当前默认算法SHOWpassword_encryption;-- 第二步创建用户CREATEUSERnew_fin_appWITHPASSWORDStrongPwd!2026;-- 第三步验证存储格式SELECTrolname,CASEWHENrolpasswordLIKESCRAM-SHA-256$%THENSCRAM-SHA-256WHENrolpasswordLIKEmd5%THENMD5ENDASalgorithmFROMsys_authidWHERErolnamenew_fin_app;配套HBA配置host demodb new_fin_app 192.168.126.0/24 scram-sha-2565.2 场景二密码正确但认证失败最常见的问题现象用户报错认证失败但密码确认无误。排查步骤第一步查存储格式SELECTrolpasswordFROMsys_authidWHERErolname用户名;看前缀判断是SCRAM-SHA-256、md5还是sm3。第二步查认证规则SELECTauth_methodFROMsys_hba_file_rulesWHEREuser_name{用户名}::text[];第三步对照兼容性矩阵判断同族 → 正常检查其他原因存储MD5 认证SCRAM → 需要重置密码升级跨族SCRAM vs SM3 → 需要统一算法根因存储算法与认证方法不匹配。解决方案二选一方案A推荐重置密码使用与认证方法匹配的存储算法方案B临时修改HBA配置使用兼容的认证方法5.3 场景三密码过期现象用户突然无法登录提示密码过期。排查SELECTrolname,rolvaliduntilFROMsys_authidWHERErolname用户名;如果rolvaliduntil不为空且小于当前时间说明密码已过期。解决方案ALTERUSER用户名 VALID UNTILinfinity;-- 或者设置一个新的过期时间ALTERUSER用户名 VALID UNTIL2027-01-01 00:00:00;5.4 场景四新建用户仍是旧算法现象明明改了password_encryption参数新建的用户却还是MD5格式。排查-- 查看当前会话的参数值SHOWpassword_encryption;-- 检查是否有用户级覆盖SELECTrolname,rolconfigFROMsys_authidWHERErolname用户名;根因会话级或用户级的参数设置覆盖了全局配置。解决方案-- 重置当前会话的参数RESET password_encryption;-- 或重置用户级参数ALTERROLE 用户名 RESET password_encryption;第六章快速诊断工具箱6.1 一键查看所有用户状态SELECTrolname,CASEWHENrolpasswordLIKESCRAM-SHA-256$%THENSCRAMWHENrolpasswordLIKEmd5%THENMD5WHENrolpasswordLIKEsm3%THENSM3WHENrolpasswordISNULLTHEN未设置ENDAS存储算法,(SELECTauth_methodFROMsys_hba_file_rulesWHEREuser_name({||rolname||})::text[]ORuser_name{all}::text[]LIMIT1)AS认证方法,rolvaliduntilAS密码过期时间FROMsys_authidWHERErolcanlogintrueANDrolnameNOTIN(system,kingbase);6.2 排查要点速查故障现象可能原因关键检查解决方案密码正确但认证失败存储与认证不匹配查rolpassword和HBA重置密码或修改HBA新建用户仍是MD5会话级参数覆盖SHOW password_encryptionRESET参数提示密码过期超过有效期查rolvaliduntilALTER USER设置有效期国密用户连不上存储用SCRAM认证用SM3查存储格式和HBA重置密码为国密格式写在最后回到开头那个让人困惑的问题密码正确为什么连不上答案其实不复杂密码存储和口令认证是两套独立的机制。存储算法决定密码怎么存在数据文件里认证方法决定客户端连接时怎么验证。两者必须兼容否则就会认证失败。理解了这个逻辑排查这类问题时就有了清晰的思路先查sys_authid看存储格式再查sys_hba.conf看认证方法然后对照兼容性矩阵判断问题所在。数据库安全是一个系统工程而用户认证是第一道关口。希望这篇文章能帮助你在日常运维中少踩一些坑。