MD5在api属性文件中散列数据库密码

时间:2015-11-24 16:09:35

标签: postgresql encryption md5 java-api

我有一个与Postgres交谈的休息api,现在在api的属性文件中我们正在硬编码数据库密码。 所以我们认为当在postgres中创建用户角色时,我们可以使用Md5哈希值(或任何其他应该由postgres解密的加密值)作为密码......我们可以在api属性文件中使用该值(hased值)而不是硬编码的。

我的问题是我们可以在api dev属性文件中使用该Md5哈希值吗?当密码通过网络发送并尝试连接到postgres它会(postgres)解密为实际密码并允许用户连接到DB而不用身份验证失败?????

2 个答案:

答案 0 :(得分:2)

TL; DR:您不能将散列密码存储在属性文件中并使用它进行身份验证,除非客户端应用程序能够识别出它已预先散列并避免第二次散列过程。

如果客户端库 识别预扫描密码(libpq没有),则散列密码可用作真实密码的代理。如果您知道哈希,则无需知道真实密码。这意味着在属性文件中存储散列密码比存储原始密码更安全。

在通过电线发送密码之前,密码会被盐渍并再次进行哈希处理,因此您无法嗅到电线上显示的内容并使用该密码进行身份验证。

查看sendAuthRequest中的源代码src/backend/libpq/auth.c

/* Add the salt for encrypted passwords. */
if (areq == AUTH_REQ_MD5)
    pq_sendbytes(&buf, port->md5Salt, 4);
<port struct Port src/include/libpq/libpq-be.h位于char md5Salt[4]; /* Password salt */ ,其中包含:

ConnCreate

这是由src/backend/postmaster/postmaster.c中的 /* * Precompute password salt values to use for this connection. It's * slightly annoying to do this long in advance of knowing whether we'll * need 'em or not, but we must do the random() calls before we fork, not * after. Else the postmaster's random sequence won't get advanced, and * all backends would end up using the same salt... */ RandomSalt(port->md5Salt); 设置的:

md5_crypt_verify

现在,密码已在src/backend/libpq/crypt.c的{​​{1}}中得到验证。在那里,我们看到已经存储为md5的密码再次使用会话盐进行哈希处理:

        if (isMD5(shadow_pass))
        {
            /* stored password already encrypted, only do salt */
            if (!pg_md5_encrypt(shadow_pass + strlen("md5"),
                                port->md5Salt,
                                sizeof(port->md5Salt), crypt_pwd))
            {
                pfree(crypt_pwd);
                return STATUS_ERROR;
            }
        }

因此,线路上发送的散列密码可以防止会话盐的重放攻击。

客户端应用程序是否可以识别预先调整的密码及其预期的格式取决于客户端库。

根据pg_password_sendauth中的src/interfaces/libpq/fe-auth.c,libpq前端似乎没有检查预先散列的密码输入。其他客户可能会有所不同。

答案 1 :(得分:1)

要清楚 - md5哈希是加密。

  

19.3.2。密码验证

     

基于密码的身份验证方法是 md5 密码。这些   除了密码发送的方式之外,方法的操作类似   在整个连接中,分别是MD5-hashed和clear-text

     

如果你在关注密码“嗅探”攻击那么md5   是优选的。如果可能,应始终避免使用普通密码。   但是,md5不能与db_user_namespace功能一起使用。如果   连接受SSL加密保护,然后可以使用密码   安全(尽管SSL证书认证可能是更好的选择   如果一个人依赖于使用SSL)。

     

PostgreSQL数据库密码与操作系统用户是分开的   密码。每个数据库用户的密码都存储在   pg_authid系统目录。可以使用SQL管理密码   命令CREATE USER和ALTER USER,例如,CREATE USER foo WITH   密码'秘密'。如果没有为用户设置密码,则   存储的密码为空,密码验证将始终失败   对于那个用户。

如果您为pg_hba.conf Postgres client authentication file 配置 password-based authentication md5),则不需要显式使用md5()函数将数据库密码保存在属性文件中。

出于加密目的 - 您可以配置数据库连接以使用SSL。请检查Secure TCP/IP Connections with SSL