PostgreSQL中的密码验证方法

在这里插入图片描述

假设您想在客户端/服务器协议中实现密码身份验证方法。 您将如何做到这一点以及可能出现的问题是什么? 以下是 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.rhkb.cn/news/99644.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CloudQuery:更好地管理你的 OceanBase 数据库

前言:作为 OceanBase 的生态合作伙伴,CloudQuery(简称“CQ”) 最新发布的社区版 2.2.0 新增了 OceanBase 数据库,为企业使用 OceanBase 数据库提供全面的支持。包括连接与认证、查询与分析、数据安全与权限管理&#x…

【仿写tomcat】三、通过socket读取http请求信息

仿写tomcat 建立Socket连接获取连接信息查看HTTP信息 建立Socket连接 这里我们也是创建一个专门管理socket的类 package com.tomcatServer.socket;import java.io.*; import java.net.ServerSocket;/*** 套接字存储** author ez4sterben* date 2023/08/15*/ public class Soc…

【校招VIP】java语言考点之List和扩容

考点介绍: List是最基础的考点,但是很多同学拿不到满分。本专题从两种实现子类的比较,到比较复杂的数组扩容进行分析。 『java语言考点之List和扩容』相关题目及解析内容可点击文章末尾链接查看!一、考点题目 1、以下关于集合类…

操作系统练习:在Linux上创建进程,及查看进程状态

说明 进程在执行过程中可以创建多个新的进程。创建进程称为“父进程”,新的进程称为“子进程”。每个新的进程可以再创建其他进程,从而形成进程树。 每个进程都有一个唯一的进程标识符(process identifier,pid)。在L…

通过远程访问解决家人的电脑难题

家里老人使用电脑、手机等设备遇到问题,子女在其他城市没法现场解决,远程沟通很困难。有没有一种方法可以随时远程帮助家人解决电脑、手机相关问题? 通过远程桌面软件,你可以与父母一起实时解决问题。这样他们就不会一遍遍给你打…

Linux系统的目录结构

file system hierarchy standard文件系统层级标准,定义了在类Unix系统中的目录结构和目录内容。 即让用户了解到已安装软件通常放置于哪个目录下。 Linux目录结构的特点 使用树形目录结构来组织和管理文件。 整个系统只有一个根目录(树根)&a…

Java虚拟机(JVM):垃圾收集算法

目录 一、分代收集理论 二、标记-清除算法 三、标记-复制算法 四、标记-整理算法 一、分代收集理论 分代收集理论建立在两个分代假说之上: 1、弱分代假说:绝大多数对象都是朝生夕灭的。 2、强分代假说:熬过越多次垃圾收集过程的对象就…

rust入门系列之Rust介绍及开发环境搭建

Rust教程 Rust基本介绍 网站: https://www.rust-lang.org/ rust是什么 开发rust语言的初衷是: 在软件发展速度跟不上硬件发展速度,无法在语言层面充分的利用硬件多核cpu不断提升的性能和 在系统界别软件开发上,C出生比较早,内…

排序(七种排序)

1.插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 7.归并排序 1.插入排序 1.1思路 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为 止,得到一个新的有序序列 1.2实现 //插入排…

部署LVS-DR群集

目录 DR模式 LVS负载均衡群集 数据包流向分析 DR 模式的特点 LVS-DR中的ARP的问题 问题1 问题2 DR模式 LVS负载均衡群集部署 部署192.168.142.21(DR服务器) 部署192.168.142.22、192.168.142.23(Web 服务器1、Web 服务器2&#xff0…

(成功踩坑)electron-builder打包过程中报错

目录 注意:文中的解决方法2,一定全部看完,再进行操作,有坑 背景 报错1: 报错2: 1.原因:网络连接失败 2.解决方法1: 3.解决方法2: 3.1查看缺少什么资源文件 3.2去淘…

云曦暑期学习第六周——kali

1.熟悉网络配置 一般来说虚拟机有三种网络模式: NAT (网络地址转换模式)Bridged (桥接模式)Host-Only(主机模式) nat模式: 虚拟系统会通过宿主机的网络来访问外网。而这里的宿主机相当于有两个网卡,一个是真实网卡…

SpringCloud Ribbon中的7种负载均衡策略

SpringCloud Ribbon中的7种负载均衡策略 Ribbon 介绍负载均衡设置7种负载均衡策略1.轮询策略2.权重策略3.随机策略4.最小连接数策略5.重试策略6.可用性敏感策略7.区域敏感策略 总结 负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端…

MongoDB 安装 linux

本文介绍一下MongoDB的安装教程。 系统环境:CentOS7.4 可以用 cat /etc/redhat-release 查看本机的系统版本号 一、MongoDB版本选择 当前最新的版本为7.0,但是由于7.0版本安装需要升级glibc2.25以上,所以这里我暂时不安装该版本。我们选择的是6.0.9版本…

互斥锁的概念,与部分接口

何为互斥 一种对共享数据的保护,防止多线程同时访问共享资源的时,数据混乱的问题。在互斥期间,保证执行流由并行改为串行。任何时刻,互斥保证有且只有一个执行流进入临界区,访问临界资源,通常对临界资源起…

时序预测 | MATLAB实现ELM极限学习机时间序列预测(多指标、相关图)

时序预测 | MATLAB实现ELM极限学习机时间序列预测(多指标、相关图) 目录 时序预测 | MATLAB实现ELM极限学习机时间序列预测(多指标、相关图)效果一览基本介绍程序设计学习总结参考资料效果一览 基本介绍 时序预测 | MATLAB实现ELM极

[HZNUCTF 2023 preliminary] 2023杭师大校赛(初赛) web方向题解wp 全

ezflask 先看题目,应该是模板注入(SSTI),输入{{7*‘7’}}直接报错误。 发现模板是反序输出的,怪不得不能直接输入{{}}。 输入}}‘7’*7{{返回777777,是jinja2 //直接手打,无所谓我是怨种 ?nam…

【数理知识】向量的坐标基表示法,Matlab 代码验证

序号内容1【数理知识】向量的坐标基表示法,Matlab 代码验证2【数理知识】向量与基的内积,Matlab 代码验证 文章目录 1. 向量的坐标基表示2. 二维平面向量举例3. Matlab 代码验证Ref 1. 向量的坐标基表示 假设空间中存在一个向量 a ⃗ \vec{a} a &#…

一次网络不通“争吵“引发的思考

作者: 郑明泉、余凯 为啥争吵,吵什么? “你到底在说什么啊,我K8s的ecs节点要访问clb的地址不通和本地网卡有什么关系…” 气愤语气都从电话那头传了过来,这时电话两端都沉默了。过了好一会传来地铁小姐姐甜美的播报声…

学习笔记:Opencv实现拉普拉斯图像锐化算法

2023.8.19 为了在暑假内实现深度学习的进阶学习,Copy大神的代码,记录学习日常 图像锐化的百科: 图像锐化算法-sharpen_lemonHe_的博客-CSDN博客 在环境配置中要配置opencv: pip install opencv-contrib-python Code and lena.png…