PostgreSQL中的密码验证方法

news2025/1/24 5:32:30

在这里插入图片描述

假设您想在客户端/服务器协议中实现密码身份验证方法。 您将如何做到这一点以及可能出现的问题是什么? 以下是 PostgreSQL 中如何完成此操作的故事。

password

一开始,PostgreSQL 只有 pg_hba.conf 中现在称为“password”的方法。 这是你能想象到的最简单的事情:

1.客户端对服务器说:“你好,我是 Peter,我想要连接。”

2.服务器回复:“你的密码是什么?”

3.客户端提示输入密码或从其他地方获取密码并响应:“这是‘123456’。”

4.现在服务器查找实际密码。 它存储在系统目录 pg_authid 列 rolpassword 中。 服务器基本上执行 strcmp(pg_authid.rolpassword, “123456”),如果相等,它会向客户端说“OK”,会话启动将继续。

这种方法有一些明显的问题:

•密码通过网络线路以明文形式传输。 有一些外部方法可以解决这个问题,例如使用 SSL 或其他加密封装。

•密码以明文形式存储在系统目录中,最终存储在磁盘上。 这很糟糕,因为它允许数据库和系统管理员看到其他用户的密码。 当然,人们不应该重复使用密码,但事实上人们可能会这样做。 它还可以允许管理员通过使用密码以其他用户身份登录来绕过审核。 一般来说,存在明文密码是不好的,因为它最终可能会被复制或意外看到。 最好不要这样做。

•更微妙的是,密码以明文形式存在于服务器进程的内存中。 为什么这么糟糕? 因为管理员也可能可以在那里访问它。 此外,如果服务器核心转储或交换,明文密码可能最终会出现在磁盘上的某个位置。 因此,这实际上几乎与在磁盘存储中以明文形式保存密码一样糟糕。

crypt

于是又尝试了另一种方法。这是在pg_hba.conf中不再支持的“crypt”认证方式。

1.客户端再次开始:“你好,我是 Peter,我想连接。”

2.已配置为使用 crypt 方法的服务器响应:“请告诉我使用盐(salt)'ab’对你的密码进行crypt()加密后的值?” 每次连接尝试都会随机选择salt干扰串。

3.客户端获取用户的输入内容并计算 crypt(“123456”, “ab”)然后回复:“这是‘ab01FAX.bQRSU’。”

4.服务器检查 crypt(pg_authid.rolpassword, “ab”) 是否等于“ab01FAX.bQRSU”,如果是则回复“OK”。

crypt() 是一个常见且随时可用的 Unix 函数,用于进行加密,因此它是在此处使用的明显选择。 它解决了以明文形式传输密码的问题,但仍然存在一些现有问题和新问题:

•密码仍以明文形式保存在系统目录和存储中。

•原始 crypt() 使用的加密方法现已过时。 同样,盐值长度salt(2 个字节)也已过时。

•因此,类 Unix 操作系统的不同供应商已扩展了 crypt() 的调用以使用不同的加密算法,但这是以不兼容的方式完成的。crypt() 只用于加密本地使用的密码(就像最初的用途一样)是可以的,但是当您想通过网络在不同系统之间进行通信时,它就会崩溃。

•crypt() 可能在非 Unix 系统上不可用。 虽然可以提供替代品,但如果需要这样做的话,就会对使用操作系统中现成的设施的原始前提产生疑问。

md5

到此时,PostgreSQL 已经支持 SSL,因此线传输过程中的明文问题不再那么重要。 真正让人烦恼的是系统目录中的明文密码。 因此设计了一个新系统,在pg_hba.conf中称为“md5”。 它的工作原理如下:

1.客户端:“你好,我是 Peter,我想连接。”

2.服务器:“请告诉我使用盐(salt)'abcd’对你的密码进行MD5哈希后的值?” 同样,每次连接尝试时都会随机选择盐。

3.客户端获取用户输入并计算:md5(md5(“123456” + “peter”) + “abcd”)。 (我在这里使用 + 进行字符串连接。)这里,“123456”是用户输入的密码,“peter”是用户名,“abcd”是盐值。 然后客户端回复:“这是‘301eddd34d997f72bd43ba678e36a5ba’。”

4.服务器检查 md5(pg_authid.rolpassword + “abcd”) 是否等于“301eddd34d997f72bd43ba678e36a5ba”,如果是则回复“OK”。

那么这方法有什么问题呢?

•现在读到这里,使用 MD5 显然是一个危险信号。 哈希方法已过时。

•盐值salt的长度(4 字节)也已过时。

•用户名被用作存储的哈希密码的盐值。 (这是为了确保两个恰好具有相同密码的用户不会具有相同的存储哈希值。)因此,重命名用户会使存储的哈希密码失效,并且需要分配新密码。 这可能并不常见,但发生时仍然很烦人。

•如果有人碰巧从系统目录(或者可能是备份转储)中获取了存储的哈希密码的副本,他们可以使用这些密码进行登录。您不需要实际的密码。 例如,在上面的步骤 3 中,客户端可以在不知道“123456”的情况下只发送 md5(“我找到的哈希值”+“abcd”)。 (你不能使用库存 libpq 来做到这一点,但制作一个可以做到这一点的自定义版本对于专门的攻击者来说并不难。)

这里的教训是:不要设计自己的加密方法。

scram

因此,所有这些问题都必须重新考虑,目前的解决方案是在 PostgreSQL 10引入的使用公共标准的:SASL(RFC 4422)和 SCRAM(RFC 5802 和 RFC 7677)。

SASL 是一个协议框架,允许客户端和服务器协商身份验证机制。 这在电子邮件中被广泛使用:SMTP 或 IMAP 服务器可能提供名称为 PLAIN、LOGIN、CRAM-MD5 或 DIGEST-MD5 的身份验证机制,或许还有 SCRAM,尽管这种情况似乎较少见。 PostgreSQL 使用 SASL 的原因主要是因为 SCRAM 是通过 SASL 定义的,因此遵循它是有意义的。 否则 SASL 功能不会向用户公开。

SCRAM 是一种身份验证机制。 它实际上是一组身份验证机制,具有不同的可能的哈希算法。 当最初考虑在 PostgreSQL 中实现 SCRAM 时,大多数以前的 SCRAM 使用都采用 SHA-1,但它已经过时了,并且在撰写本文时也已被弃用,就像 MD5 一样。 所以PostgreSQL目前使用的算法是SHA-256,认证方式的全称是SCRAM-SHA-256。

整个过程大致如下,传输过程中的数据格式如下:

1.客户端:“你好,我是 Peter,我想连接。”

2.服务器:“我们将进行 SASL 身份验证。 选择以下方法之一:SCRAM-SHA-256”。 (目前只有一种方法,除非提供通道绑定,但为了简单起见,我在这篇博文中忽略了这一点。)

3.客户端:“我选择 SCRAM-SHA-256。 这是第一个 SASL 数据:n,n=peter,r=rOprNGfwEbeRWgbNEkqO“。 该数据根据 SCRAM 规范进行组装并封装在 SASL 协议消息中。 这里,“n=”字段包含用户名,“r=”字段包含base64编码的随机字符串。 前面的内容与通道绑定有关,我们在这里忽略它。

4.服务器:“这是一些 SASL 数据:r=rOprNGfwEbeRWgbNEkqO%hvYDpWUa2RaTCAfuxFIlj)hNlF$k0,s=W22ZaJ0SNY7soEsUEjb6gQ==, i=4096”。 “r=”字段包含客户端的随机数据以及服务器附加的附加随机数据。 此外,服务器还发送盐值 (s=) 和交互计数 (i=),这是从相关用户存储的密码中获取的。

5.客户端:“这是一些 SASL 数据:c=biws,r=rOprNGfwEbeRWgbNEkqO%hvYDpWUa2RaTCAfuxFIlj)hNlF$k0, p=dHzbZapWIk4jUhN+Ute9ytag9zjfMHgsqmmiz7AndVQ=”。 “r=”字段与之前相同。 客户端和服务器只需来回发送此消息以检查它们是否仍在与正确的对方进行通信。 “p=”字段是客户端用户提供的密码,然后使用提供的盐值和迭代计数以特定方式对其进行哈希处理。 “c=”字段用于通道绑定。

6.服务器现在会根据本地存储的数据检查此数据。 其详细内容在此省略。 如果满足,则发回:“这是最终的 SASL 数据:v=6rriTRBi23WpRR/wtup+mMhUZUn/dB5nLTJRsjl95G4=”。 这称为验证器,允许客户端检查服务器是否确实检查了密码,而不仅仅是让每个人都通过。

7.然后客户端检查验证器,如果满足条件,则会话可以继续进行。

这里涉及很多内容。这解决了我们之前讨论的所有问题,甚至包括我们还没有考虑到的一些问题:

•密码不会以明文形式传输到网络中。

•密码在系统目录或底层存储中不是明文形式。

•密码在服务器进程中永远不会以明文形式存在。 实际上,明文密码从未离开客户端。客户端以一定的方式对其进行哈希处理,服务器将其与已有的哈希信息进行比较,但服务器永远不会看到实际的密码。

•客户端发送的任何信息都不能被其他任何人用来登录,即使整个交换过程被捕获。 这是因为客户端和服务器在每次连接尝试中都使用不同的随机数据。

•每个存储的密码都使用不同的盐值进行哈希处理,因此实际上不存在不同用户存储的密码意外相同的风险。 此外,盐值与用户名或用户的其他属性无关。

•盐长度可以轻松改变。 用户只需使用不同的盐值创建新密码即可。

•可以以系统化的方式将算法添加到此设计中。 请注意,这仍然需要更改软件,并且不会完全轻松,但至少有一个明确的方法可以做到这一点。

•正如上面第7点提到的,客户端可以验证服务器是否确实检查了密码。 在客户端/服务器身份验证中,我们通常主要考虑服务器试图阻止未经授权的客户端连接。 这是因为服务器存储了未经授权的客户端可能想要获取的有价值的数据。 但相反的情况也可能发生:客户端连接到伪造的服务器并向其发送服务器不应该获得的有价值的数据。 这样的服务器会很高兴地让任何碰巧连接的客户端进入,而不实际检查密码。 SCRAM 可以防止这种情况发生。 显然,SSL/TLS 是一种更复杂、更完整的解决方案,用于检查网络中的节点是否值得信赖,SCRAM 并不意味着消除这种需要。

这就是 PostgreSQL 现在的情况。

LDAP认证和其他认证方法

PostgreSQL中还有另一组与密码相关的认证方法:

•ldap

•radius

•pam

•bsd

对于客户端和协议而言,这些方法与明文认证方式“password”是等效的。 唯一的区别是服务器不会将密码与 pg_authid 中存储的密码进行比较,而是与相应的外部服务进行比较。 例如,LDAP 身份验证的工作原理如下:

1.客户端:“你好,我是 Peter,我想连接。”

2.服务器:“您的密码是什么?”

3.客户端:“是‘123456’。”

4.现在服务器向 LDAP 服务器检查密码“123456”。 这本身就可能涉及许多细节。 如果检查成功,服务器会说“OK”。

因此,这避免了将密码以明文形式存储在数据库中,但仍然存在与此方法相关的所有其他问题。 使用 SSL 进行 PostgreSQL 连接并安全地配置 LDAP 服务器和连接可以缓解许多此类问题,但它不会像 SCRAM 那样安全。 (另一条建议是,如果目标是在组织范围内建立集中式密码存储,则可以考虑使用 Kerberos 而不是 LDAP,但那是另一个话题了。)

总结

安全和密码学是很复杂的。通过使用SCRAM,PostgreSQL采用了公认的公共标准,现在处于一个良好的状态,并且可以在未来进行适应。

PostgreSQL考试认证中心(简称:PGCCC)
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/894805.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字化施工:解决传统施工难题,提高施工效率和质量的行业革命

建筑行业是我国国民经济的重要组成部分,也是支柱性产业之一。然而,建筑业同时也是一个安全事故多发的高风险行业。如何加强施工现场的安全管理,降低事故发生的频率,避免各种违规操作和不文明施工,提高建筑工程的质量&a…

web即时通讯系统与APP即时通讯系统有什么区别?

随着互联网的不断发展,即时通讯技术也在不断地完善和发展,其中Web即时通讯系统和APP即时通讯系统成为了人们广泛使用的两种通讯方式。那么,这两者之间究竟有什么区别呢?在本文中,我们将为您详细介绍这两种通讯方式的区…

“RFID与光伏板的完美融合:探索能源科技的新时代!“

随着科技的不断发展,人类创造出了许多令人惊叹的发明。其中,RFID(Radio Frequency Identification)技术的应用在各个领域日益广泛。最近的研究表明,将RFID技术应用于光伏板领域,不仅可以提高光伏板的效率&a…

BY133 整流二极管 1300V 1A DO-41

BY133是什么类型的二极管?BY133厂家,哪家厂家在生产?BY133厂家哪家好?二极管BY133参数怎么看?BY133二极管报价,价格多少?二极管BY133哪家供应商有现货……对于一枚电子元器件而言,其…

Android2:构建交互式应用

一。创建项目 项目名Beer Adviser 二。更新布局 activity_main.xml <?xml version"1.0" encoding"utf-8"?><LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"…

低代码系列——初步认识低代码

低代码系列目录 一、初步认识低代码 二、低代码是什么 三、低代码平台的概念和分类 01.无代码开发平台 02.低代码应用平台(LCAP) 03.多重体验开发平台(MXDP) 04.智能业务流程管理套件(iBPMS) 四、低代码的能力指标 五、低代码平台jnpf 表单 报表 流程 权限 一、初步认识低代码 …

正规的股票杠杆公司_杠杆公司排名(2023年版的)

本文将介绍一些正规的股票杠杆公司&#xff0c;并重点介绍配先查网站的特点&#xff0c;该网站是一家专业查询实盘杠杆平台的网站&#xff0c;提供相关信息和参考。 杠杆公司排名&#xff08;2023年版的&#xff09;&#xff1a;广盛网、一鼎盈、尚红网、盛多网、红腾网、富灯…

神卓互联内网穿透搭建云表系统

云表是什么&#xff1f; 云表系统是一种无代码开发平台&#xff0c;它具备完善的功能和各种业务级应用管理模板&#xff0c;可以帮助中小企业快速开发和定制自己的系统。通过云表系统&#xff0c;用户可以使用表格编程的开发方式&#xff0c;就像使用Excel一样简单&#xff0c…

BT利器之wazuh

目录 一、什么是wazuh 二、wazuh的安装 1.仓库安装 2.虚拟机OVA安装 3.其他安装方式 三、浅析wazuh的规则、解码器等告警原理以及主动响应 1.主动响应(active-response) 2.告警信息(alerts) 3.规则以及解码器(rules and decoders) 3.1.规则 3.2.解码器 4.linux后门r…

大疆飞卡30运载无人机技术分享

大疆飞卡30是大疆公司面向运输领域推出的一款专业运载无人机。它采用了优秀的设计,装备了多种先进传感器,以解决运输中的难题。以下我们来了解一下其主要特点: 【应用领域】 飞卡30适用于山地救灾、农业化肥施用、工程材料运送等交通不便的山区应用,也适用于海岛联通等运输链…

WinSW使用说明

使用说明 前言下载配置介绍示例jar包启动示例 安装服务 前言 由于使用windows自动的自启方法&#xff0c;不管是将程序启动服务放到开机自启文件夹中&#xff0c;还是创建任务计划程序&#xff0c;都没有很好的实现程序的开机自启效果&#xff0c;而WinSW很好的解决了这个问题…

【数据结构OJ题】复制带随机指针的链表

原题链接&#xff1a;https://leetcode.cn/problems/copy-list-with-random-pointer/description/ 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 此题可以分三步进行&#xff1a; 1. 拷贝链表的每一个结点&#xff0c;拷贝的结点先链接到被拷贝结点…

气象环境监测设备介绍

气象环境监测设备&#xff0c;是用于测量和监测气象参数的设备&#xff0c;可以根据不同功能、环境要求添加不同的传感器设备&#xff0c;主要用于气象领域、环保领域、农业领域等。 接下来&#xff0c;就让我们来介绍一下常见的气象监测设备都有哪些吧。 一、风速/风向监测设…

通义千问项目制作

这一次我们来做一个通义千问的项目 1.申请和开通 1.1.文字识别开通 首先&#xff0c;打开文字识别_OCR 文字识别_图片识别文字_数据智能-阿里云 (aliyun.com)页面并登陆阿里云账号&#xff0c;点击&#xff0c;文字识别服务。接下来在RAM 访问控制 (aliyun.com)页面申请一个A…

【学习笔记之opcua】使用Python获取opcua数据

Python与OPC UA的应用 示例代码 将代码放入spyder中运行后&#xff0c;出现下面这个错误 没有‘opcua’&#xff0c;那我们就下载pip install opcua 之后出现下面这个错误 问问题大不&#xff0c;安装语句写错了 正经安装语句是 !pip install opcua 读取opcua协议数据测试 …

快速入门vue3新特性和新的状态管理库pinia

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 Vue3.3新特性 defineOptions defineModel pinia 介绍 与 Vuex 3.x/4.x 的比较 安装 核心概念 定义…

css 实现文字横向循环滚动

实现效果 思路 ## 直接上代码,html部分 //我这里是用的uniapp <view class"weather_info_wrap"><view class"weather_info">当前多云&#xff0c;今晚8点转晴&#xff0c;明天有雨&#xff0c;温度32摄氏度。</view><view class&qu…

什么是异常处理

文章目录 异常处理介绍自定义异常页面文档:自定义异常页面说明 自定义异常页面-应用实例需求:代码实现 全局异常说明全局异常-应用实例需求:代码实现完成测试 自定义异常说明自定义异常-应用实例需求&#xff1a;代码实现完成测试 注意事项完成测试 异常处理 介绍 默认情况下…

DELL PowerEdge R720XD 磁盘RAID及Hot Spare热备盘配置

一台DELL PowerEdge R720XD服务器&#xff0c;需进行磁盘RAID及Hot Spare热备盘配置&#xff0c;本文记录配置过程示例。 一、设备环境 服务器型号&#xff1a;DELL PowerEdge R720XD 硬盘配置&#xff1a;800G硬盘共24块 二、配置计划 1、当前状态&#xff1a;2块盘配置RAID…

C语言 poll多路复用

NAME poll, ppoll - wait for some event on a file descriptor SYNOPSIS #include <poll.h> 函数原型&#xff1a; int poll(struct pollfd *fds, nfds_t nfds, int timeout); #define _GNU_SOURCE /* See feature_test_macros(7) */ …