最近,在我们客户的一个站点上,我和客户都需要访问数据库。 在我的机器上,我已经存储了密码,但是客户显然不想依赖我的机器,并且密码本身是散列的,因此我们无法猜测。 但猜猜怎么了? 我们可以! 我在Google上搜索了一下,令人难以置信的是,我找到了编写以下小型实用程序的说明,该程序已根据ASL 2.0的条款授予您使用:
免责声明:此程序绝不打算对您造成任何伤害。 您可以在网络上的其他任何地方找到此信息。 请仅使用此密码来恢复您自己的“丢失”密码。 像我一样。
另请注意,这仅适用于小于4的SQL Developer版本。
import java.io.File;
import java.security.GeneralSecurityException;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
public class SQLDeveloperDecrypter {
public static void main(String[] args) throws Exception {
if (args.length == 0) {
System.err.println(" Usage 1: " + SQLDeveloperDecrypter.class.getName() + " 0501F83890..... (a single encrypted password)");
System.err.println(" Usage 2: " + SQLDeveloperDecrypter.class.getName() + " C:\\Users\\...... (the path to the connections.xml file)");
System.err.println();
System.err.println(" Pass the password hash code from your connections.xml file. The file might be located at (example)");
System.err.println(" C:\\Users\\[User]\\AppData\\Roaming\\SQL Developer\\system2.1.1.64.45\\o.jdeveloper.db.connection.11.1.1.2.36.55.30");
System.exit(-1);
}
if (args[0].startsWith("05")) {
System.out.println(decryptPassword(args[0]));
}
else {
File file = new File(args[0]);
if (file.isDirectory())
file = new File(file, "connections.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(file.toURI().toString());
// The relevant structure is:
//
// <Reference name="connection name">
// <RefAddresses>
// <StringRefAddr addrType="password">
// <Contents>057D3DE2...
XPathFactory xPathfactory = XPathFactory.newInstance();
XPath xpath = xPathfactory.newXPath();
XPathExpression expr = xpath.compile("//StringRefAddr[@addrType='password']/Contents");
NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET);
for (int i = 0; i < nodes.getLength(); i++) {
Element e = (Element) nodes.item(i);
System.out.println("Connection name : " +
((Element) e.getParentNode().getParentNode().getParentNode()).getAttribute("name")
);
System.out.println("Password (encrypted): " +
e.getTextContent()
);
System.out.println("Password (decrypted): " +
decryptPassword(e.getTextContent())
);
System.out.println();
}
}
}
// From: http://stackoverflow.com/a/140861
public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));
}
return data;
}
// From: http://stackoverflow.com/a/3109774
public static String decryptPassword(String result) throws GeneralSecurityException {
return new String(decryptPassword(hexStringToByteArray(result)));
}
public static byte[] decryptPassword(byte[] result) throws GeneralSecurityException {
byte constant = result[0];
if (constant != 5) {
throw new IllegalArgumentException();
}
byte[] secretKey = new byte[8];
System.arraycopy(result, 1, secretKey, 0, 8);
byte[] encryptedPassword = new byte[result.length - 9];
System.arraycopy(result, 9, encryptedPassword, 0, encryptedPassword.length);
byte[] iv = new byte[8];
for (int i = 0; i < iv.length; i++) {
iv[i] = 0;
}
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secretKey, "DES"), new IvParameterSpec(iv));
return cipher.doFinal(encryptedPassword);
}
}
从这里和这里借来了部分源代码。 换句话说,几乎任何黑客都可以提出上述程序。 和输出? 这个:
Connection name : SAKILA
Password (encrypted): 0517CB1A41E3C2CC3A3163234A6A8E92F8
Password (decrypted): SAKILA
Connection name : TEST
Password (encrypted): 05B03F45511F83F6CD4D322C9E173B5A94
Password (decrypted): TEST
精彩! 现在,我的计算机上的所有密码都可以在恒定时间内恢复(没有暴力破解)。
这会让你觉得吗? 我希望您的DBA不在SQL Developer中存储其密码。 在笔记本电脑上。 他们在火车上忘记了。 可以访问客户的信用卡信息。
但是,与此同时,我很高兴我可以为我的客户找回丢失的密码!
翻译自: https://www.javacodegeeks.com/2014/06/sql-developers-securely-encrypted-passwords.html