SHA-512 является криптографической (односторонней) хэш-функцией, поэтому прямого способа ее декодирования не существует. Вся цель криптографической хеш-функции заключается в том, что вы не можете отменить ее.
Одна вещь, которую вы можете сделать, это стратегия грубой силы, где вы угадываете то, что было хешировано, затем хешируете его с той же функцией и смотрите, соответствует ли оно. Если хешированные данные не очень легко угадать, это может занять много времени.
Возможно, вы захотите взглянуть на одну из технологий интеграции Java-COM. Я лично работал с JACOB (JAva COm Bridge):
Это было довольно громоздко (подумайте, работая исключительно с отражением), но выполнил работу за меня (быстрое доказательство концепции, доступ к MapPoint из Java).
Единственная другая подобная технология, о которой я знаю, это Jawin, но у меня нет личного опыта с ней:
Обновление от 26.04.2009: Просто ради этого я провел дополнительные исследования в Microsoft Windows Search и нашел простой способ интеграции с ним с помощью OLE DB. Вот некоторый код, который я написал в качестве доказательства концепции:
public static void main(String[] args) {
DispatchPtr connection = null;
DispatchPtr results = null;
try {
Ole32.CoInitialize();
connection = new DispatchPtr("ADODB.Connection");
connection.invoke("Open",
"Provider=Search.CollatorDSO;" +
"Extended Properties='Application=Windows';");
results = (DispatchPtr)connection.invoke("Execute",
"select System.Title, System.Comment, System.ItemName, System.ItemUrl, System.FileExtension, System.ItemDate, System.MimeType " +
"from SystemIndex " +
"where contains('Foo')");
int count = 0;
while(!((Boolean)results.get("EOF")).booleanValue()) {
++ count;
DispatchPtr fields = (DispatchPtr)results.get("Fields");
int numFields = ((Integer)fields.get("Count")).intValue();
for (int i = 0; i < numFields; ++ i) {
DispatchPtr item =
(DispatchPtr)fields.get("Item", new Integer(i));
System.out.println(
item.get("Name") + ": " + item.get("Value"));
}
System.out.println();
results.invoke("MoveNext");
}
System.out.println("\nCount:" + count);
} catch (COMException e) {
e.printStackTrace();
} finally {
try {
results.invoke("Close");
} catch (COMException e) {
e.printStackTrace();
}
try {
connection.invoke("Close");
} catch (COMException e) {
e.printStackTrace();
}
try {
Ole32.CoUninitialize();
} catch (COMException e) {
e.printStackTrace();
}
}
}
Чтобы скомпилировать это, вам нужно убедиться, что JAWIN JAR находится в вашем classpath, и что jawin.dll находится на вашем пути (или java.library.path системное свойство). Этот код просто открывает соединение ADO с локальным индексом поиска Windows Desktop, запрашивает документы с ключевым словом «Foo» и распечатывает несколько ключевых свойств в итоговых документах.
Дайте мне знать, если у вас есть какие-либо вопросы, или нужно, чтобы я что-то прояснил.
Обновление от 27.04.2009: I tried implementing the same thing in JACOB as well, and will be doing some benchmarks to compare performance differences between the two. I may be doing something wrong in JACOB, but it seems to consistently be using 10x more memory. I'll be working on a jcom and com4j implementation as well, if I have some time, and try to figure out some quirks that I believe are due to the lack of thread safety somewhere. I may even try a JNI based solution. I expect to be done with everything in 6-8 weeks.
Update 04/28/2009: Это просто обновление для тех, кто следил и любопытно. Оказывается, нет проблем с многопоточностью, мне просто нужно было явно закрыть ресурсы моей базы данных, поскольку соединения OLE DB предположительно объединены в пул на уровне операционной системы (я, вероятно, в любом случае должен был закрыть соединения ...). Я не думаю, что буду дальнейшими обновлениями к этому. Дайте мне знать, если у кого-то возникнут какие-либо проблемы с этим.
Обновление 05.01.2009: Added JACOB example per Oscar's request. This goes through the exact same sequence of calls from a COM perspective, just using JACOB. While it's true JACOB has been much more actively worked on in recent times, I also notice that it's quite a memory hog (uses 10x as much memory as the Jawin version)
public static void main(String[] args) {
Dispatch connection = null;
Dispatch results = null;
try {
connection = new Dispatch("ADODB.Connection");
Dispatch.call(connection, "Open",
"Provider=Search.CollatorDSO;Extended Properties='Application=Windows';");
results = Dispatch.call(connection, "Execute",
"select System.Title, System.Comment, System.ItemName, System.ItemUrl, System.FileExtension, System.ItemDate, System.MimeType " +
"from SystemIndex " +
"where contains('Foo')").toDispatch();
int count = 0;
while(!Dispatch.get(results, "EOF").getBoolean()) {
++ count;
Dispatch fields = Dispatch.get(results, "Fields").toDispatch();
int numFields = Dispatch.get(fields, "Count").getInt();
for (int i = 0; i < numFields; ++ i) {
Dispatch item =
Dispatch.call(fields, "Item", new Integer(i)).
toDispatch();
System.out.println(
Dispatch.get(item, "Name") + ": " +
Dispatch.get(item, "Value"));
}
System.out.println();
Dispatch.call(results, "MoveNext");
}
} finally {
try {
Dispatch.call(results, "Close");
} catch (JacobException e) {
e.printStackTrace();
}
try {
Dispatch.call(connection, "Close");
} catch (JacobException e) {
e.printStackTrace();
}
}
}
Как показывают несколько постов, вы можете соединить Java и .NET или COM с помощью коммерческих или бесплатных платформ, таких как JACOB, JNBridge, J-Integra и т. Д. На самом деле у меня был опыт общения с одной из этих третьих сторон (дорогой :-)), и я должен сказать, что сделаю все возможное, чтобы избежать повторения этой ошибки в будущем. Причина в том, что в нем много «вуду» вещей, которые вы не можете отладить, очень сложно понять, в чем проблема, когда что-то идет не так.
Решение, которое я бы предложил вам реализовать, - создать простой .NET приложение, которое делает реальные вызовы API поиска Windows. После этого вам нужно установить канал связи между этим компонентом и вашим Java-кодом. Это можно сделать различными способами, например, отправив сообщения на небольшую БД, которую ваше приложение будет периодически извлекать. Или зарегистрируйте этот компонент на компьютере IIS (если он существует) и предоставьте простой WS API для связи с ним.
Любая причина, по которой вы не могли просто использовать Runtime.exec ()
для запроса с помощью search-ms
и чтения BufferedReader
с результатом команды? Например:
public class ExecTest {
public static void main(String[] args) throws IOException {
Process result = Runtime.getRuntime().exec("search-ms:query=microsoft&");
BufferedReader output = new BufferedReader(new InputStreamReader(result.getInputStream()));
StringBuffer outputSB = new StringBuffer(40000);
String s = null;
while ((s = output.readLine()) != null) {
outputSB.append(s + "\n");
System.out.println(s);
}
String result = output.toString();
}
}
Существует несколько библиотек для вызова COM-объектов из Java, некоторые с открытым исходным кодом (но их кривая обучения выше), некоторые с закрытым исходным кодом и с более быстрой кривой обучения. Пример закрытого источника - EZCom . Коммерческие, как правило, также фокусируются на вызове java из окон, чего я никогда не видел в opensource.
В вашем случае я бы посоветовал вам сделать вызов в вашем собственном классе .NET (думаю, использовать C #, как это ближе всего к Java, не вдаваясь в спорные J #), и сосредоточиться на создании взаимодействия с .NET DLL. Таким образом, программирование Windows становится проще, а интерфейс между Windows и Java становится проще.
Если вы ищете, как использовать библиотеку Java, то MSDN не то место. Но MSDN поможет вам написать то, что вам нужно, изнутри .NET, а затем посмотрите учебники по библиотеке com о вызове одного или двух методов, которые вам нужны из ваших объектов .NET.
РЕДАКТИРОВАТЬ:
Учитывая обсуждение в ответы об использовании веб-службы, вы могли бы (и, вероятно, вам повезет) создать небольшое приложение .NET, которое вызывает встроенный веб-сервер Java, а не пытаться заставить .NET иметь встроенный веб-сервис и иметь Java как потребителя. вызова. Для встроенного веб-сервера мое исследование показало, что Winstone хорош. Не самый маленький, но гораздо более гибкий.
Чтобы заставить это работать, нужно запустить приложение .NET из Java и заставить приложение .NET вызывать веб-сервис по таймеру или циклу, чтобы увидеть, есть ли запрос, и, если он есть, обработайте его и отправьте ответ.
а затем посмотрите учебники по библиотеке com о вызове одного или двух методов, которые вам нужны из ваших объектов .NET.РЕДАКТИРОВАТЬ:
Учитывая обсуждение ответов на вопросы об использовании веб-службы, вы можете (и, вероятно, будете иметь повезет) создайте небольшое приложение .NET, которое вызывает встроенный веб-сервер Java, вместо того, чтобы пытаться заставить .NET иметь встроенный веб-сервис и использовать Java как потребителя вызова. Для встроенного веб-сервера мое исследование показало, что Winstone хорош. Не самый маленький, но гораздо более гибкий.
Чтобы заставить это работать, нужно запустить приложение .NET из Java и заставить приложение .NET вызывать веб-сервис по таймеру или циклу, чтобы увидеть, есть ли запрос, и, если он есть, обработайте его и отправьте ответ.
а затем посмотрите учебники по библиотеке com о вызове одного или двух методов, которые вам нужны из ваших объектов .NET.РЕДАКТИРОВАТЬ:
Учитывая обсуждение ответов на вопросы об использовании веб-службы, вы можете (и, вероятно, будете иметь повезет) создайте небольшое приложение .NET, которое вызывает встроенный веб-сервер Java, вместо того, чтобы пытаться заставить .NET иметь встроенный веб-сервис и использовать Java как потребителя вызова. Для встроенного веб-сервера мое исследование показало, что Winstone хорош. Не самый маленький, но гораздо более гибкий.
Чтобы заставить это работать, нужно запустить приложение .NET из Java и заставить приложение .NET вызывать веб-сервис по таймеру или циклу, чтобы увидеть, есть ли запрос, и, если он есть, обработайте его и отправьте ответ.
Учитывая обсуждение ответов на вопросы об использовании веб-службы, вы можете (и, вероятно, вам повезет) создать небольшое приложение .NET, которое вызывает встроенный веб-сервер Java, а не пытаться заставить .NET иметь встроенный веб-сервис. И пусть Java будет потребителем звонка. Для встроенного веб-сервера мое исследование показало, что Winstone хорош. Не самый маленький, но гораздо более гибкий.
Чтобы заставить это работать, нужно запустить приложение .NET из Java и заставить приложение .NET вызывать веб-сервис по таймеру или циклу, чтобы увидеть, есть ли запрос, и, если он есть, обработайте его и отправьте ответ.
Учитывая обсуждение ответов на вопросы об использовании веб-службы, вы можете (и, вероятно, вам повезет) создать небольшое приложение .NET, которое вызывает встроенный веб-сервер Java, а не пытаться заставить .NET иметь встроенный веб-сервис. И пусть Java будет потребителем звонка. Для встроенного веб-сервера мое исследование показало, что Winstone хорош. Не самый маленький, но гораздо более гибкий.
Чтобы заставить это работать, нужно запустить приложение .NET из Java и заставить приложение .NET вызывать веб-сервис по таймеру или циклу, чтобы увидеть, есть ли запрос, и, если он есть, обработайте его и отправьте ответ.
NET имеет встроенный веб-сервис, а java будет потребителем звонка. Для встроенного веб-сервера мое исследование показало, что Winstone хорош. Не самый маленький, но гораздо более гибкий.Чтобы заставить это работать, нужно запустить приложение .NET из Java и заставить приложение .NET вызывать веб-сервис по таймеру или циклу, чтобы увидеть, есть ли запрос, и, если он есть, обработайте его и отправьте ответ.
NET имеет встроенный веб-сервис, а java будет потребителем звонка. Для встроенного веб-сервера мое исследование показало, что Winstone хорош. Не самый маленький, но гораздо более гибкий.Чтобы заставить это работать, нужно запустить приложение .NET из Java и заставить приложение .NET вызывать веб-сервис по таймеру или циклу, чтобы увидеть, есть ли запрос, и, если он есть, обработайте его и отправьте ответ.