我正在构建一个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就足够了吗?
感谢。
答案 0 :(得分:0)
我认为仅在每条路径上使用SSL就足够了。在LedgerSMB中(虽然我们是基于Perl的)我们做了一些不同的事情,依赖于服务器之间以及服务器和客户端之间的SSL保护链接。不过,您的方法有几点需要考虑。
我们实际上通过SSL连接以可重复使用的格式(纯文本)将db用户名和密码传递给客户端的中间件,然后使用另一个SSL连接登录PostgreSQL以通过这种方式进行身份验证。这很好,但我们面临的问题区域与您将遇到的问题区域有些相似。其中包括:
记录日志。密码会不会被意外记录?这是LedgerSMB的一个问题,我们采取了我们可以采取的步骤,但配置错误的服务器或篡改程序可以记录用户名和密码。在我们的例子中,这主要是在中间件级别,但在您的情况下,查询日志记录也可以这样做,对吧?
是否有可能无意中重复使用凭据?我们以两种方式阻止这种情况,但值得考虑。
总的来说,我们信任SSL。除此之外,添加额外的加密技术并没有太大的收获,而且密钥管理增加了很多复杂性,而这些复杂性并不值得IMO的边际收益。