使用md5密码

时间:2018-05-26 06:11:33

标签: postgresql md5

我在www.postgresql.org上阅读了文档,其中有this text about md5 login

  

方法md5使用自定义不太安全的质询 - 响应机制。它可以防止密码嗅探,并避免以明文形式在服务器上存储密码,但如果攻击者设法从服务器窃取密码哈希,则不提供保护。此外,MD5哈希算法现在不再被认为对确定的攻击是安全的。

这是否意味着,如果我知道存储在数据库中的md5哈希,我可以使用md5哈希远程连接而不是普通密码本身?如果是这样,我该怎么做?我使用的ODBC驱动程序似乎只允许输入纯文本密码,而不是md5哈希。这样做有可能吗?

2 个答案:

答案 0 :(得分:1)

我不知道有任何客户会为您提供开箱即用的服务。更改客户端源代码以执行此操作非常容易,并编译一个新的“hackerized”客户端。

答案 1 :(得分:0)

是的,没错。您只需要哈希密码即可。哈希背后的想法是,如果密码被盗,窃贼不能与其他帐户尝试相同的密码。

要使用散列密码进行身份验证,您必须与服务器说line protocol - 您将收到“AuthenticationMD5Password”并使用“GSSResponse”回答。

所有司机都为您做第一个哈希步骤;例如,请参阅JDBC驱动程序中的这段代码:

/**
 * Encodes user/password/salt information in the following way: MD5(MD5(password + user) + salt)
 *
 * @param user The connecting user.
 * @param password The connecting user's password.
 * @param salt A four-salt sent by the server.
 * @return A 35-byte array, comprising the string "md5" and an MD5 digest.
 */
public static byte[] encode(byte[] user, byte[] password, byte[] salt) {
  MessageDigest md;
  byte[] temp_digest;
  byte[] pass_digest;
  byte[] hex_digest = new byte[35];

  try {
    md = MessageDigest.getInstance("MD5");

    md.update(password);
    md.update(user);
    temp_digest = md.digest();

    bytesToHex(temp_digest, hex_digest, 0);
    md.update(hex_digest, 0, 32);
    md.update(salt);
    pass_digest = md.digest();

    bytesToHex(pass_digest, hex_digest, 3);
    hex_digest[0] = (byte) 'm';
    hex_digest[1] = (byte) 'd';
    hex_digest[2] = (byte) '5';
  } catch (NoSuchAlgorithmException e) {
    throw new IllegalStateException("Unable to encode password with MD5", e);
  }

  return hex_digest;
}