0

我正在构建一个具有 Java Swing 前端访问 postgres 数据库的系统。在本周发现Jasypt之前,我原本打算使用 Postgres 自己的加密机制。它工作得很好,但我现在也希望对网络上的密码进行加密,因此我求助于 Jasypt。

问题是,我需要一个固定密码才能输入到我的 Postgres 存储函数中。即如果输入密码是“aaa”,那么任何其他输入到 Postgres 存储函数中的密码(“aaa”除外)都将不匹配。

有没有办法让这两种加密机制协同工作,还是我必须转储 Postgres?

我的用户表:

CREATE TABLE "user"
(
  id serial NOT NULL,
  cryptpwd text NOT NULL,
  md5pwd text NOT NULL,
  ...
)

加密密码:

cryptedPassword = crypt(passwordIn, gen_salt('md5'));
md5Password = md5(passwordIn);
INSERT INTO "user"(username, cryptpwd, md5pwd, ...)
      VALUES (usernameIn, cryptedPassword, md5Password, ...);

解密密码:

select ..... from "user" .... where username = usernameIn and cryptpwd = crypt(passwordIn, cryptpwd);

如果我不能让他们两个一起工作,那么我将不得不转储 Postgres 的机制,因为我需要通过网络进行加密。

此外,关于数据库连接字符串和数据库用户名和密码(不使用任何框架......希望使用 SSL 的普通旧 jdbc 连接 - 尚未实现),我认为我无法使用 Jasypt,因为我需要在数据库级别对其进行解密。对于这种情况,仅 SSL 就足够了吗?

谢谢。

4

1 回答 1

0

我认为在每条路径上单独使用 SSL 就足够了。在 LedgerSMB(尽管我们是基于 Perl 的)中,我们做一些不同的事情,并依赖于服务器之间以及服务器和客户端之间的 SSL 保护链接。不过,您的方法需要考虑一些事情。

实际上,我们通过 SSL 连接以可重用格式(纯文本)从客户端将 db 用户名和密码传递给中间件,然后使用另一个 SSL 连接登录 PostgreSQL 以通过这种方式进行身份验证。这很好用,但我们面临的问题领域与您将面临的问题领域有些相似。这些包括:

  1. 记录。密码是否可能会被意外记录?这是 LedgerSMB 的一个问题,我们会采取我们可以采取的措施,但配置不当的服务器或被篡改的程序可能会记录用户名和密码。在我们的例子中,这主要来自中间件级别,但在你的例子中,查询日志也可以做到这一点,对吧?

  2. 是否有可能无意中重复使用凭据?我们通过多种方式防止这种情况发生,但值得考虑。

总的来说,我们信任 SSL。除此之外,添加额外的加密并没有什么好处,而且密钥管理增加了很多复杂性,这不值得 IMO 的边际收益。

于 2013-04-04T13:04:41.607 回答