扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
是的。
目前成都创新互联已为近1000家的企业提供了网站建设、域名、网络空间、网站改版维护、企业网站设计、连江网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。
Postgresql的加密函数是crypt不是encrypt。crypt()和gen_salt专用于密码哈希加密,crypt计算哈希值,gen_salt为crypt提供算法参数,gen_salt是随机产生一个值并传递给crypt使用。
crypt支持的算法,bf,md5,xdes,des。
[toc]
PGCRYPTO
固若金汤 - PostgreSQL pgcrypto加密插件
Postgresql数据加密函数介绍
根据给定的算法获取给定数据的hash值。br / 标准算法支持有md5、sha1、sha224、sha256、sha384和sha512br /e.g.
用key计算hash值,type和digest一样,hmac和digest类似,但是只有知道key的情况下才能计算出哈希值,
这样可以预防更改数据以及更改哈希匹配的情况,如果key大于hash block size,那么先计算哈希值,哈希值作为key使用br /e.g.
crypt()用来计算hash值.br /gen_salt()随机产生一个值作为crypt()的算法参数. br /gen_salt()的type参数为des, xdes, md5, bf. br /gen_salt()的iter_count指迭代次数, 数字越大加密时间越长, 被破解需要的时间也越长.br /crypt()和gen_salt()的组合主要是提高了逆向破解的难度, 增强了数据的安全性
crypt和gen_salt是以牺牲hash速度为代价来换取安全性的
e.g.
该功能实现了部分OpenPGP (RFC 4880)标准的加密。支持 对称秘钥 和 公共秘钥 的加密。
一条加密的PGP消息包含2个部分,或数据包:
pgp_key_id 抽取一个 PGP 公钥或私钥的密钥 ID。或者如果给定了一个加密过的消息,它给出一个用来加密数据的密钥 ID。
它能够返回 2 个特殊密钥 ID:
注意不同的密钥可能具有相同的 ID。这很少见但是是一种正常事件。客户端应用则应该尝试用每一个去解密,看看哪个合适 — 像处理 ANYKEY 一样
这些函数把二进制数据包装/解包成 PGP ASCII-armored 格式,其基本上是带有 CRC 和额外格式化的 Base64。
用一个公共 PGP 密钥 key 加密 data 。给这个函数一个私钥会产生一个错误。br / options 参数可以包含下文所述的选项设置
解密一个公共密钥加密的消息。 key 必须是对应于用来加密的公钥的私钥。如果私钥是用口令保护的,你必须在 psw 中给出该口令。如果没有口令,但你想要指定选项,你需要给出一个空口令。
不允许使用 pgp_pub_decrypt 解密 bytea 数据。这是为了避免输出非法的字符数据。使用 pgp_pub_decrypt_bytea 解密原始文本数据是好的。
options 参数可以包含下文所述的选项设置。
带有一个对称的PGP秘钥 psw 加密 data 。 options 参数可以包含选项设置。
e.g.
解密一个对称秘钥加密的PGP消息。br /用 pgp_sym_decrypt 解密 bytea 数据是不允许的。 br /这是为了避免输出不合法的字符数据。br /用 pgp_sym_decrypt_bytea 解密原始的文本数据是可以的。br / options 参数可以包含选项设置。
e.g.
只有PostgreSQL编译的时候带有zlib选项时才可以使用下来该选项的压缩算法
e.g.
Whether to convert textual data from database internal encoding to UTF-8 and back. If your database already is UTF-8, no conversion will be done, but the message will be tagged as UTF-8. Without this option it will not be.
e.g.
How much to compress. Higher levels compress smaller but are slower. 0 disables compression.
e.g.
Which cipher algorithm to use.
e.g.
Whether to convert \n into \r\n when encrypting and \r\n to \n when decrypting. RFC 4880 specifies that text data should be stored using \r\n line-feeds. Use this to get fully RFC-compliant behavior.
e.g.
Do not protect data with SHA-1. The only good reason to use this option is to achieve compatibility with ancient PGP products, predating the addition of SHA-1 protected packets to RFC 4880. Recent gnupg.org and pgp.com software supports it fine.
e.g.
Which S2K algorithm to use.
e.g.
Which digest algorithm to use in S2K calculation.
e.g.
Which cipher to use for encrypting separate session key.
e.g.
Use separate session key. Public-key encryption always uses a separate session key; this is for symmetric-key encryption, which by default uses the S2K key directly.
e.g.
相信如果你在重新安装或者升级Postgresql数据库的时候都需要你输入在第一次安装时候的密码,这个密码往往我们都会忘记,那么万一忘记了该咋办?难道真就不能安装了?答案当然是否定的。在项目中,本人就遇到过这样的情况,一番摸索过后发现终于发现其中的奥秘,首先,Postgresql 安装时,会往用户组中添加一个postgresql用户,而这个用户就是阻止你密码验证不能通过的罪魁祸首,好吧,将其删除,再试试呢,成功了。别急,有些时候,你在安装的时候还会报一些错误,我同事就遇到此类情况,最后发现Postgresql 还会在当前用户下记录一下信息,比如管理工具的默认用户名和密码等信息,密码是不加密的哦!!以我的Win 7 32bit Enterprise version 为例,我的用户为:Abc_Zhou,则在C:\Users\abc_zhou\AppData\Roaming folder下看到有postgresql,删掉吧,好了,至此,你将能够完全安装成功了。
有时候在不知道密码的情况下如何能够使用数据库呢?当然前提是你知道用户名。这个是比较纠结的问题,用以上方法重装?显然不行,谁能保证我的数据呢。别急,咱们也有办法,首先,来到数据库的安装目录data文件夹下面,我的是9.0.4 version,路径为(PostgreSQL\9.0\data),然后找到pg_hba.conf文件,在最下放有一下几句话:
# TYPE DATABASE USER CIDR-ADDRESS METHOD
# IPv4 local connections:
host all all 127.0.0.1/32 md5
# IPv6 local connections:
host all all ::1/128 md5
好吧,将所有的md5修改称为trust,重启数据库服务,再去界面登录看看,记住不要输入密码哦。当你登录成功了之后难道想改个密码还不容易?
Alter user 'postgres' with password '123456';
至此,重新把method改回md5吧,重启服务,使用刚刚修改的密码登录,果断成功了。
好了,到此基本上完成我们的全部需求了,可是,有时候我们又不想改掉原本的密码,或许系统中还会有其他软件使用此用户呢。好,那还不简单,重新创建一个用户不就得了,不错好方法。但是我要告诉你一个更绝的办法,就是如果有人在管理工具中登录并保存过密码,那你就可以通过以下文件直接找出密码:C:\AllUsers\abc_zhou\AppData\postgresql 中的pgpass.conf 文件(机器环境同上),记事本打开就ok了,是不是可以看到密码了,就是这么简单。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流