我在www.postgresql.org上阅读了文档,其中有this text about md5 login:
方法
md5
使用自定义不太安全的质询 - 响应机制。它可以防止密码嗅探,并避免以明文形式在服务器上存储密码,但如果攻击者设法从服务器窃取密码哈希,则不提供保护。此外,MD5哈希算法现在不再被认为对确定的攻击是安全的。
这是否意味着,如果我知道存储在数据库中的md5哈希,我可以使用md5哈希远程连接而不是普通密码本身?如果是这样,我该怎么做?我使用的ODBC驱动程序似乎只允许输入纯文本密码,而不是md5哈希。这样做有可能吗?
答案 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;
}