问题标签 [pgcrypto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
postgresql - 使用 pgcrypto (PostgresQL) 解密 AES GCM 256
我正在尝试使用使用 AES GCM 256 加密的 pgcrypto 解密消息。
加密规格:
所以我收到一个:
- 身体
- 钥匙
- iv_header
- auth_tag
我尝试了以下
我一直收到错误decrypt_iv error: Data not a multiple of block size
消息,而我希望收到编码的消息{"type": "PAYMENT"}
我希望在 and 的解码和连接中出现问题body
,auth_tag
但无法弄清楚是什么。
关于我这样做/为什么这样做的一些说明
- 我将它
auth_tag
与body
几个来源描述的方式联系起来。 - 我使用该
convert_to
函数,因为它似乎是连接两个bytea
值的唯一方法
我设法用其他语言(即雪花或 Python)解密此消息
如果有人看到我做错了什么或有一些指示,我们将不胜感激。
java - 使用 pgcrypto 模块在 postgres 中加密和在 java 中解密
我创建了一个触发器和一个触发器函数,它在表上的每个更新操作上调用并加密一个特定的值,如下所示:
上面的加密方法工作正常,一个装甲的 PGP 加密值保存如下:
解密需要在我遵循以下两个步骤的应用程序级别完成:
- 添加了 bcpg-jdk15on 和 bcprov-jdk15on 依赖项。(v1.47)
- 执行:
在使用上述方法解密值时,我不断收到以下异常:
线程“主”org.bouncycastle.openpgp.PGPDataValidationException 中的异常:数据检查失败。在 org.bouncycastle.openpgp.PGPPBEEncryptedData.getDataStream(Unknown Source) at org.bouncycastle.openpgp.examples.ByteArrayHandler.decrypt(Unknown Source) at abc.demo.encryption.SymmetricDecyption.main(SymmetricDecyption.java:59)
因此,有人可以指导我采用适当的方法在应用程序级别(而不是在查询中)实现解密。
postgresql - 函数 hmac(text, text, text) 不存在
正在运行 pg_repack 并失败并出现以下错误。
WARNING: Error with create index: ERROR: function hmac(text, text, text) does not exist LINE 1: ...225736 ON repack.table_224997 USING btree (encode(hmac((('id... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts.
但是 pgcrypto 扩展安装在公共模式中。
-[ RECORD 5 ]------------------------------------------------------------------ Name | pgcrypto Version | 1.3 Schema | public Description | cryptographic functions
show search_path ; -[ RECORD 1 ]---------------- search_path | "$user", public
你能帮我理解为什么它失败了。谢谢
spring - 使用 @ColumnTransformer 从 pgcrypto 动态生成密码
我需要使用注释 @ColumnTransformer 使 pgcrypto 中的密码动态化。
使用这段代码,我可以保存加密的数据并解密。
但我需要使用这个 getMasterkey 使密码动态化:
postgresql - 我真的必须删除 pgcrypto 扩展才能升级 postgres 数据库吗?
详细信息:我们正在使用 heroku 的向导将 postgres 从 v9.6 升级到更新版本,但是我们发现它不起作用,heroku 支持人员说我们必须删除 pgcrypto 扩展,然后重新添加它完成。
这听起来对人们来说是正确的吗?它正在对我们的架构造成重大变化。
我们的架构中有以下内容:
some_ID text DEFAULT gen_random_uuid() NOT NULL,
删除扩展时,它抱怨特定列some_id
依赖function gen_random_uuid()
并使用级联删除扩展。
运行DROP EXTENSION pgcrypto CASCADE;
它会导致架构发生变化 -DEFAULT gen_random_uuid()
部分被剥离,我们最终得到some_ID text NOT NULL,
java - 使用 Java 和 Postgres 数据库进行客户端加密
我已经对客户端每租户加密的实现进行了大量的挖掘和研究,但对于我应该如何继续我们的应用程序感到有些困惑。在某些背景下,我们有一个dropwizard
应用程序,它有许多自定义 DAO,它们postgres
使用jooq
. 我们的数据库有许多表、自定义函数和自定义用户定义的数据类型。我们的要求是我们客户的一些敏感数据需要加密(数据库表中的某些列)。数据按每个租户的行进行分区。
我知道我有两个选择将数据加密放在哪里。
- 在我们的应用程序中
- 在我们的
postgres
数据库中
这是我在探索上述两个选项时发现的:
虽然将加密放在我们的应用程序中是我最初的计划,但必须编辑每个 DAO 可能会导致许多问题并花费大量时间。
因此,我研究了让数据库使用 pgcrypto 和列侧加密来处理加密的替代方案。但是,就像前面提到的那样,由于我们对列的所有自定义数据类型,我无法为这些自定义数据类型列存储任何加密数据,因为加密数据以bytea
. 修剪文档和其他堆栈溢出帖子除了更改这些列的数据类型以接受 bytea 与我希望尽可能避免的自定义类型之外,我无法找到解决方案。
在此之后,我对下一步如何最好地进行有点困惑,因为我在这里列出的两个选项都需要大量时间,并且可能会破坏我们的很多应用程序。
我有其他一些想法:
- 我已经调查
jooq
或liquibase
进行了加密,但在那里找不到任何东西。 - 无需更新列的数据类型,只需创建一个新的加密版本的数据库并使用视图来表示表的明文。
我的大问题:鉴于这里的背景信息,是否有任何建议或替代方案来实施客户端加密?(对我们当前架构的破坏最小)
谢谢!:)
sql - postgresql 的 crypt() 函数如何知道密码与存储的密码匹配?
我正在学习使用pgcrypto中的crypt()函数来加密我的密码并将它们存储到用户表中。
但是,如果我们将现有密码作为第二个参数传递,我不明白 crypt 函数如何生成相同的密码。
我想了解它是如何做到的。
在上面的示例中,如果我执行并存储变量的值。
I get : "$2a$06$.lub5s4Eqz4.epcg5zW4Ke" for generated_salt "$2a$06$.lub5s4Eqz4.epcg5zW4KervErzw//uARn8F2gchj2wM11ok.MJLK" for hashResult "$2a$06$.lub5s4Eqz4.epcg5zW4KervErzw//uARn8F2gchj2wM11ok.MJLK" for authenticationPassword
为什么authenticationPassword与hashResult相同,我希望它用 hashResult 作为盐再次对其进行哈希处理。
它如何判断它是否必须识别和计算相同的密码或基于盐生成新的哈希?
PS:我了解如何使用该功能来存储/检索密码,但我不明白它是如何做到的。
谢谢您的帮助,
python-3.x - Python SQLALchemy 在编译查询的 where 子句中使用 pgp_sym_decrypt 列而不是 pgp_sym_encrypt 变量
我为每个表使用类模型,并为每个使用 SQLAlchemy 的 sql 操作提供方法。
我安装 pgp_sym_encrypt 和 pgp_sym_decrypt 与 PostgreSQL 的扩展
在 SQLAlchemy 文档的帮助下,我使用了我的类 User,我在 pgp_sym_encrypt 的帮助下加密了数据,PostgreSQL 的包 pgcrypto 的功能(我使用版本 13.4)
为了安全起见,我对用户 i 的数据进行加密我想使用 postgreSQL 的原生 pgp_sym_encrypt 和 pgp_sym_decrypt 原生函数。在我使用纯文本查询与 psycopg2 进行此操作之前。由于我使用的是 SQLAlchemy ORM,因此通过它进行 Flask-SQLALchemy 扩展。
我找到了解决方案: https ://docs.sqlalchemy.org/en/14/core/custom_types.html#applying-sql-level-bind-result-processing
但是它们都没有显示在查询中使用它们的示例
实际上我的代码如下:
一切正常,当我使用我的 create_user 方法时,用户数据已加密他的数据。
但是,如果在我的课程中我添加了一个方法来检查用户是否存在,通过此方法检查用户名、电子邮件或其他数据:
这将产生以下查询:
这个查询返回None
是因为当我们使用带有实际 ENCRYPTION_KEY 的 pgp_sym_encrypt 时,数据将以一种新的方式加密。
https://www.postgresql.org/docs/13/pgcrypto.html#id-1.11.7.34.8 https://en.wikipedia.org/wiki/Pretty_Good_Privacy#/media/File:PGP_diagram.svg
那么如何修改 SQLAlchemy 文档函数PGPString(TypeDecorator):
以使用 pgp_sym_decrypt 来解密列而不是加密变量,如下面的查询:
通常我现在用 Python 和 SQLAlchemy 做得很好,但这真的超出了我的技能,我真的不知道如何修改这个函数,因为它会影响我完全不知道的功能。
目前我使用文本功能,但这很丑
例如,从用户名(加密数据)获取 id 的另一种方法
非常感谢你的帮助 !此致
postgresql - 为非超级用户安装 PostgreSQL 扩展
我的应用程序的数据库有一个像这样具有完全访问权限的专用用户;
在我的应用程序启动时,我有以下查询以确保 UUID 扩展可用;
这很好用。但是我最近尝试添加一个相同的查询来创建像这样的“pgcrypto”扩展;
这未能声称我需要超级用户权限来创建扩展。所以我决定以超级用户的身份手动创建它。但是,即使我在 Adminer 中以 postgres 用户身份登录并成功创建了扩展,它也不能用于我的应用程序(mydb 用户)中的查询。
我不熟悉 PostgreSQL 中使用的命名空间机制,所以我想知道如何创建扩展,以便它可以在我的应用代码中可用,而无需授予应用用户超级用户权限?