PostgreSql: 个人学习总结记录

PostgreSQL的默认密码,如何修改密码?

首次连接Linux上的PostgreSQL时,许多管理员都会有疑问,尤其是那些管理员来自MySQL世界。默认情况下,当安装PostgreSQL时,会添加postgres用户。

如果你运行以下命令:

cat /etc/passwd

你会看到一个名为postgres的用户。

postgres:x:26:26:PostgreSQL Server:/var/lib/pgsql:/bin/bash

第一个问题是,用户"postgres"的默认密码是什么? 回答很容易—回答很容易—没有默认密码。

cat /var/lib/pgsql/9.3/data/pg_hba.conf

你将看到认证模式是正确的。

# IPv4 local connections: host all all 127.0.0.1/32 ident # IPv6 local connections: host all all ::1/128 ident

身份验证方法是什么? 它是通过获取你正在操作的操作系统用户名,并将它与允许的数据库用户名进行比较,用户名进行了映射。

这意味着为了连接到PostgreSQL,你必须以正确的操作系统用户身份登录,在本例中,我们作为root登录到服务器,当我们尝试连接到PostgreSQL时:

psql

我们得到以下错误:

psql: FATAL: role"root" does not exist

但是,如果我们成为默认的PostgreSQL用户postgres :

su -postgres

然后再尝试连接到PostgreSQL :

psql

得到了正确有效的回应!

psql (9.3.9) Type"help" for help.
postgres=#	

如何修改密码:

MySQL默认的超级管理员是root
连接方法:mysql -u root
默认密码为空
修改密码的方法:mysqladmin -u root password 'new password'

PostgreSQL默认的超级管理员密码是postgres
连接方法:psql -U postgres(注意,是大写的-U)
默认密码为空
修改密码的方法是:
进入 postgres 库中,执行:ALTER USER "mistral-user" WITH PASSWORD 'Af8zZoL24vQtAnQIIn2XjaHC';
	其中 mistral-user 为用户,
执行:select * from pg_authid ; 可以看到相应的账号和密码之间的对应关系,其中的密码是用 md5 加密

一般都知道pg_hba.conf里面有配置了MD5方式来访问加密,所以用户表里存的密码数据也该是md5加密后的数据,但到底是怎么组合加密的就不得而知了。

加密的时候加了salt,下面从源码分析一下这个加密的过程:

所谓加Salt,就是加点“佐料”。当用户首次提供密码时(通常是注册时),由系统自动往这个密码里加一些“Salt值”,这个值是由系统随机生成的,并且只有系统知道。然后再散列。而当用户登录时,系统为用户提供的代码撒上同样的“Salt值”,然后散列,再比较散列值,已确定密码是否正确。   
这样,即便两个用户使用了同一个密码,由于系统为它们生成的salt值不同,他们的散列值也是不同的。即便黑客可以通过自己的密码和自己生成的散列值来找具有特定密码的用户,但这个几率太小了(密码和salt值都得和黑客使用的一样才行)。

PostgreSql 加密源码分析

本节内容摘自:https://blog.51cto.com/yanzongshuai/2360292

一、PG用户的密码如何通过md5加密,并且是否加了salt?本文将从源码角度跟踪分析。

PG用户通过md5加密时,加了salt,而这个salt是用户名字符串。

先谈一下postgresql中涉及用户密码的几张表:

select username,passwd from pg_shadow;

select rolname,rolpassword from pg_authid;

select usename,passwd from pg_user;

select rolname,rolpassword from pg_roles

前面两张表存有加密后的密码字符串,后面两张表存的密码都是***,我们感兴趣的前面两张表,通过简单的测试我们可以发现,同样的用户,使用同样的密码得到加密后的字符串是一样的。

二、源码分析

CreateRole:
    shadow_pass = encrypt_password(Password_encryption, stmt->role,password);
    |-- pg_md5_encrypt(password, role, strlen(role),encrypted_password);
    |   |-- memcpy(crypt_buf, passwd, passwd_len);
    |   |   memcpy(crypt_buf + passwd_len, role, strlen(role));
    |   |   strcpy(buf, "md5");
    |-- |-- pg_md5_hash(crypt_buf, passwd_len + salt_len, buf + 3);
    new_record[Anum_pg_authid_rolpassword - 1] =CStringGetTextDatum(shadow_pass);

三、gdb跟踪

1、在函数encrypt_password上打断点,然后客户端执行:create user yzs with password ‘123456’;创建带密码的用户,观察是否默认使用md5。

postgres=# create user yzs with password '123456';

2、堆栈信息

Breakpoint 1, encrypt_password (target_type=PASSWORD_TYPE_MD5, role=0x99c3b3c "yzs", password=0x99c3b4c "123456") at crypt.c:111
111     PasswordType guessed_type = get_password_type(password);
(gdb) bt
#0  encrypt_password (target_type=PASSWORD_TYPE_MD5, role=0x99c3b3c "yzs", password=0x99c3b4c "123456") at crypt.c:111
#1  0x0827b7a2 in CreateRole (pstate=0x9a0d804, stmt=0x99c3bbc) at user.c:412
#2  0x0840fc18 in standard_ProcessUtility (pstmt=0x99c3c14, queryString=0x99c31dc "create user yzs with password '123456';", context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, 
    dest=0x99c3d74, completionTag=0xbf9119e6 "") at utility.c:722
#3  0x0840f42a in ProcessUtility (pstmt=0x99c3c14, queryString=0x99c31dc "create user yzs with password '123456';", context=PROCESS_UTILITY_TOPLEVEL, params=0x0, queryEnv=0x0, 
    dest=0x99c3d74, completionTag=0xbf9119e6 "") at utility.c:357
#4  0x0840e6ea in PortalRunUtility (portal=0x9a20634, pstmt=0x99c3c14, isTopLevel=1 '\001', setHoldSnapshot=0 '\000', dest=0x99c3d74, completionTag=0xbf9119e6 "") at pquery.c:1178
#5  0x0840e8b7 in PortalRunMulti (portal=0x9a20634, isTopLevel=1 '\001', setHoldSnapshot=0 '\000', dest=0x99c3d74, altdest=0x99c3d74, completionTag=0xbf9119e6 "") at pquery.c:1324
#6  0x0840ded2 in PortalRun (portal=0x9a20634, count=2147483647, isTopLevel=1 '\001', run_once=1 '\001', dest=0x99c3d74, altdest=0x99c3d74, completionTag=0xbf9119e6 "") at pquery.c:799
#7  0x08408692 in exec_simple_query (query_string=0x99c31dc "create user yzs with password '123456';") at postgres.c:1099
#8  0x0840c5d4 in PostgresMain (argc=1, argv=0x997edc4, dbname=0x997ecf4 "postgres", username=0x99558cc "postgres") at postgres.c:4088
#9  0x083864e6 in BackendRun (port=0x9978038) at postmaster.c:4409
#10 0x08385c5d in BackendStartup (port=0x9978038) at postmaster.c:4081
#11 0x083822d9 in ServerLoop () at postmaster.c:1755
#12 0x083819d6 in PostmasterMain (argc=3, argv=0x9953810) at postmaster.c:1363
#13 0x082dfb60 in main (argc=3, argv=0x9953810) at main.c:228
(gdb) n
114     if (guessed_type != PASSWORD_TYPE_PLAINTEXT)
(gdb) 
123     switch (target_type)
(gdb) 
126             encrypted_password = palloc(MD5_PASSWD_LEN + 1);
(gdb) 
128             if (!pg_md5_encrypt(password, role, strlen(role),
(gdb) s
pg_md5_encrypt (passwd=0x99c3b4c "123456", salt=0x99c3b3c "yzs", salt_len=3, buf=0x9a0d984 "") at md5.c:326
326     size_t      passwd_len = strlen(passwd);
(gdb) n
329     char       *crypt_buf = malloc(passwd_len + salt_len + 1);
(gdb) 
332     if (!crypt_buf)
(gdb) 
339     memcpy(crypt_buf, passwd, passwd_len);
(gdb) 
340     memcpy(crypt_buf + passwd_len, salt, salt_len);
(gdb) p crypt_buf
$1 = 0x9979e68 "123456A"
(gdb) n
342     strcpy(buf, "md5");
(gdb) p crypt_buf
$2 = 0x9979e68 "123456yzsנ\tQ"
(gdb) n
343     ret = pg_md5_hash(crypt_buf, passwd_len + salt_len, buf + 3);
(gdb) p crypt_buf
$3 = 0x9979e68 "123456yzsנ\tQ"
(gdb) n
345     free(crypt_buf);
(gdb) p crypt_buf
$4 = 0x9979e68 "123456yzsנ\tQ"
(gdb) n
347     return ret;
(gdb) 
348 }
(gdb) p ret
$5 = 1 '\001'
(gdb) n
encrypt_password (target_type=PASSWORD_TYPE_MD5, role=0x99c3b3c "yzs", password=0x99c3b4c "123456") at crypt.c:131
131             return encrypted_password;
(gdb) 
146 }
(gdb) 
CreateRole (pstate=0x9a0d804, stmt=0x99c3bbc) at user.c:415
415                 CStringGetTextDatum(shadow_pass);
(gdb) p shadow_pass
$6 = 0x9a0d984 "md5aed8080c314507e15542d5e9519723a8"

3、从pg_authid表中观察该用户经过md5加过密的密码值,可以看出和堆栈信息中看到的一样

postgres=# select *from pg_authid where rolname='yzs';
 rolname | rolsuper | rolinherit | rolcreaterole | rolcreatedb | rolcanlogin | rolreplication | rolbypa***ls | rolconnlimit |             rolpassword             | rolvaliduntil 
---------+----------+------------+---------------+-------------+-------------+----------------+--------------+--------------+-------------------------------------+---------------
 yzs     | f        | t          | f             | f           | t           | f              | f            |           -1 | md5aed8080c314507e15542d5e9519723a8 | 
(1 row)

postgresql 数据库 命令行常用操作

一、建立数据库连接
----------------
接入PostgreSQL数据库: psql -h IP地址 -p 端口 -U 数据库名

之后会要求输入数据库密码

二、访问数据库

1、列举数据库:\l
2、选择数据库:\c 数据库名
3、查看该某个库中的所有表:\dt
4、切换数据库:\c interface
5、查看某个库中的某个表结构:\d 表名
6、查看某个库中某个表的记录:select * from apps limit 1;
7、显示字符集:\encoding
8、退出psgl:\q

附录:

postgresql数据管理系统使用命令方式有两种:
1. 内部命令,以反斜线开始 \ ,如: \l 显示所有数据库
2. 标准SQL命令,以分号 ; 或 \g 结束,可以使用多行

数据库的关键操作:
1. 启动服务  2. 登录  3. 建立数据库  4. 建立表  5. 插入记录到表中 
6. 更新/删除/查询/修改操作           7. 退出    8. 停止服务

在windows7中安装的postgresql默认使用GBK字符集,经常不能使用显示中文的数据表,解决办法:
注意:在windows 7下的postgresql中写操作时要使用GBK,读操作时要用UTF8;

设置字符集为 utf-8 就可以了.
postgres=# \encoding utf-8       // 设置客户端的字元集
postgres=# \encoding                  // 显示客户端的字元集
postgres=# show client_encoding;      // 显示客户端的字元集
postgres=# show server_encoding;      // 显示服务器的字元集

启动服务:
net start postgresql-9.5
停止服务:
net stop postgresql-9.5

获取命令帮助:
c:\> psql --help

登录( 注意: postgres 是默认用户即管理员 ):
路径 psql -h 服务器 -U 用户名  -d 数据库 -p 端口地址  // -U 是大写
C:\> psql -h localhost -U postgres -p 5432            // 默认打开postgres数据库
C:\> psql -h 127.0.0.1 -U postgres -d fengdos -p 5432 // 打开fengdos数据库
C:\> psql -U postgres                                 // 快速登录(全部使用默认设置)
// 使用某些有密码的用户的情况下, 会提示输入密码.
用户 postgres 的口令: ILoveYou         // 输入时不会显示任何字符
// 成功后显示:
psql (9.5.3)
输入 "help" 来获取帮助信息.
// 进入postgresql数据库系统提示符状态, ******=# 中=#前面为当前使用的数据库
postgres=# help          // 获取系统帮助,显示如下:
---------------------------------------------------------
您正在使用psql, 这是一种用于访问PostgreSQL的命令行界面
键入:\copyright 显示发行条款
      \h 显示 SQL 命令的说明
      \? 显示 pgsql 命令的说明 (pgsql内部命令)
      \g 或者以分号(;)结尾以执行查询
      \q 退出注: 数据库名称区分大小写的。
---------------------------------------------------------
postgres=# \help         // 获取SQL命令的帮助,同 \h
postgres=# \quit         // 退出,同 \q
postgres=# \password dlf // 重新设置用户dlf的密码,然后需要 \q退出后才生效
c:\>psql exampledb < user.sql  // 将user.sql文件导入到exampled数据库中
postgres=# \h select   // 精细显示SQL命令中的select命令的使用方法
postgres=# \l          // 显示所有数据库
postgres=# \dt         // 显示当前数据库中的所有表
postgres=# \d [table_name]  // 显示当前数据库的指定表的表结构
postgres=# \c [database_name]  // 切换到指定数据库,相当于use
postgres=# \du                 // 显示所有用户
postgres=# \conninfo           // 显示当前数据库和连接信息
postgres=# \e   // 进入记事本sql脚本编辑状态(输入批命令后关闭将自动在命令行中执行)
postgres=# \di  // 查看索引(要建立关联)
postgres=# \prompt [文本] 名称    // 提示用户设定内部变数
postgres=# \encoding [字元编码名称]  // 显示或设定用户端字元编码
*可以将存储过程写在文本文件中aaa.sql,然后在psql状态下:
postgres=# \i aaa.sql    // 将aaa.sql导入(到当前数据库)
postgres=# \df           // 查看所有存储过程(函数)
postgres=# \df+ name     // 查看某一存储过程
postgres=# select version();            // 获取版本信息
postgres=# select usename from pg_user; // 获取系统用户信息
postgres=# drop User 用户名             // 删除用户

其它SQL命令通用如(标准化SQL语句):
*创建数据库:
create database [数据库名];

*删除数据库:
drop database [数据库名]; 

*创建表:
create table ([字段名1] [类型1] ;,[字段名2] [类型2],......<,primary key (字段名m,字段名n,...)>;);

*在表中插入数据:
insert into 表名 ([字段名m],[字段名n],......) values ([列m的值],[列n的值],......);

*显示表内容:
select * from student;

*重命名一个表:
alter table [表名A] rename to [表名B];

*删除一个表:
drop table [表名]; 

*在已有的表里添加字段:
alter table [表名] add column [字段名] [类型];

*删除表中的字段:
alter table [表名] drop column [字段名];

*重命名一个字段: 
alter table [表名] rename column [字段名A] to [字段名B];

*给一个字段设置缺省值: 
alter table [表名] alter column [字段名] set default [新的默认值];

*去除缺省值: 
alter table [表名] alter column [字段名] drop default;
 
*修改表中的某行某列的数据:
update [表名] set [目标字段名]=[目标值] where [该行特征];

*删除表中某行数据:
delete from [表名] where [该行特征];
delete from [表名];    // 删空整个表

*可以使用pg_dump和pg_dumpall来完成。比如备份sales数据库:
pg_dump drupal>/opt/Postgresql/backup/1.bak

参考:

https://blog.51cto.com/qingwang/340385

https://blog.51cto.com/yanzongshuai/2360292

https://www.cnblogs.com/my-blogs-for-everone/p/10226473.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值