<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; VBScript: Контрольная сумма, хэш и т.д.]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=8068&amp;type=atom" />
	<updated>2018-09-04T08:05:42Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=8068</id>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=128473#p128473" />
			<content type="html"><![CDATA[<p>А вариант с использованием <strong>System.Security.Cryptography</strong> не подходит ?</p><p><a href="https://stackoverflow.com/questions/10198690/how-to-generate-md5-using-vbscript-in-classic-asp">https://stackoverflow.com/questions/101 … lassic-asp</a><br /><a href="https://en.wikibooks.org/wiki/Visual_Basic_for_Applications/String_Hashing_in_VBA">https://en.wikibooks.org/wiki/Visual_Ba … ing_in_VBA</a></p>]]></content>
			<author>
				<name><![CDATA[Xameleon]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=8836</uri>
			</author>
			<updated>2018-09-04T08:05:42Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=128473#p128473</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=126891#p126891" />
			<content type="html"><![CDATA[<p>\</p>]]></content>
			<author>
				<name><![CDATA[Yurachb]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27379</uri>
			</author>
			<updated>2018-07-09T15:59:40Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=126891#p126891</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=74892#p74892" />
			<content type="html"><![CDATA[<p>Коллега <strong>VitAliS</strong> обратил внимание на утилиту <a href="http://forum.script-coding.com/viewtopic.php?id=8594">certutil</a>, и, хотя сделал он это по несколько совсем другому поводу, всё равно спасибо ему большое. Правда, к той задаче, по ходу решения которой создавалась эта тема, я в ближайшее время не вернусь, но, тем не менее, набросал себе на память:</p><div class="codebox"><pre><code>&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
&lt;package&gt;
  &lt;job id=&quot;help&quot; version=&quot;0.81&quot;&gt;
    &lt;script type=&quot;text/jscript&quot; language=&quot;JScript&quot;&gt;
      WScript.Arguments.ShowUsage();
    &lt;/script&gt;
    &lt;runtime&gt;&lt;description&gt;Hash-to-Name&lt;/description&gt;&lt;example&gt; — эта справка
    wscript //job:run hash2name.wsf [HA] file/folder [file/folder...]
    HA: /SHA1, /SHA256, /SHA384, /SHA512, /MD2, /MD4, /MD5
        добавить к имени файла контрольную сумму,
        вычисленную по соответствующему алгоритму
    wscript //job:run hash2name.wsf /clear file/folder [file/folder...]
        удалить контрольную сумму из имени файла&lt;/example&gt;
    &lt;/runtime&gt;
  &lt;/job&gt;
  &lt;job id=&quot;run&quot; version=&quot;0.7&quot;&gt;
    &lt;object id=&quot;f&quot; progid=&quot;Scripting.FileSystemObject&quot; /&gt;
    &lt;object id=&quot;s&quot; progid=&quot;WScript.Shell&quot; /&gt;
    &lt;script type=&quot;text/jscript&quot; language=&quot;JScript&quot;&gt;&lt;![CDATA[

      var a;    // HashAlgorithm

      if(WScript.Arguments.length){
        switch(WScript.Arguments(0).toUpperCase()){
         case &#039;/SHA1&#039;:a=&#039;SHA1&#039;;break;
         case &#039;/SHA256&#039;:a=&#039;SHA256&#039;;break;
         case &#039;/SHA384&#039;:a=&#039;SHA384&#039;;break;
         case &#039;/SHA512&#039;:a=&#039;SHA512&#039;;break;
         case &#039;/MD2&#039;:a=&#039;MD2&#039;;break;
         case &#039;/MD4&#039;:a=&#039;MD4&#039;;break;
         case &#039;/MD5&#039;:a=&#039;MD5&#039;;break;
         case &#039;/CLEAR&#039;:a=&#039;0&#039;;break;
         default:fc();
        }
        for(var i=1;i&lt;WScript.Arguments.length;i++){
          fa(WScript.Arguments(i));
        }
      }else fc();

      function fa(e){
        if(f.FolderExists(e)){
          with(new Enumerator(f.GetFolder(e).subFolders)){
            while(!atEnd()){
              fa(item().path);
              moveNext();
            }
          }
          with(new Enumerator(f.GetFolder(e).files)){
            while(!atEnd()){
              fb(item().path);
              moveNext();
            }
          }
        }else if(f.FileExists(e))fb(f.getFile(e).path);
      }

      function fb(e){
        s.run(&#039;cscript //job:exec &quot;&#039;+WScript.scriptFullName+&#039;&quot; &#039;+a+&#039; &quot;&#039;+e+&#039;&quot;&#039;,0,true);
      }

      function fc(){
        s.run(WScript.scriptFullName);
        WScript.quit();
      }

    ]]&gt;&lt;/script&gt;
  &lt;/job&gt;
  &lt;job id=&quot;exec&quot; version=&quot;0.4&quot;&gt;
    &lt;object id=&quot;f&quot; progid=&quot;Scripting.FileSystemObject&quot; /&gt;
    &lt;object id=&quot;s&quot; progid=&quot;WScript.Shell&quot; /&gt;
    &lt;script type=&quot;text/jscript&quot; language=&quot;JScript&quot;&gt;&lt;![CDATA[

      var
       a,
       b=f.getFile(WScript.Arguments(1)),
       c=f.getBaseName(b).replace(/\s*\[((SHA)|(MD))\d{1,3}\s*[a-fA-F0-9]+\]$/i,&#039;&#039;);

      if(WScript.Arguments(0)!=&#039;0&#039;){
        with(s.exec(&#039;CertUtil -hashfile &quot;&#039;+b.path+&#039;&quot; &#039;+WScript.Arguments(0)).stdOut){
          skipLine();
          a=readLine().replace(/\s/g,&#039;&#039;);
        }b.name=c+&#039; [&#039;+WScript.Arguments(0)+&#039; &#039;+a+&#039;].&#039;+f.getExtensionName(b);
      }else b.name=c+&#039;.&#039;+f.getExtensionName(b);

    ]]&gt;&lt;/script&gt;
  &lt;/job&gt;
&lt;/package&gt;</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Serge Yolkin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27503</uri>
			</author>
			<updated>2013-08-23T20:44:46Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=74892#p74892</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=69562#p69562" />
			<content type="html"><![CDATA[<p><strong>YMP</strong>: а как из этого массива в массиве получить доступ к байту? Брутальное vFile[0][0] не прокатило (да я и надеялся...), vFile[0].length - null или не является объектом.</p>]]></content>
			<author>
				<name><![CDATA[Serge Yolkin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27503</uri>
			</author>
			<updated>2013-02-16T14:47:37Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=69562#p69562</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=69558#p69558" />
			<content type="html"><![CDATA[<div class="quotebox"><cite>Serge Yolkin пишет:</cite><blockquote><p>Тип элементов массива - unknown, поэтому JS не считает это ни строкой (никакие методы для строк не работают), ни чилом - арифметика тоже не пашет.</p></blockquote></div><p>Фактически vFile[0] возвращает тип VT_ARRAY | VT_UI1, содержащий указатель на структуру SAFEARRAY, а в ней лежит указатель на байт. Т.е. получается, что каждый байт содержится в своём персональном массиве размером в один элемент.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2013-02-16T12:47:07Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=69558#p69558</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=69556#p69556" />
			<content type="html"><![CDATA[<p>Свою проблему я решил с помощью костылей и протезов, просто пара замечаний по предыдущим постам:<br />1. При чтении бинарника с помощью ADODB.Stream type=1 быстрее всего получается, если &quot;порция&quot; равна размеру блока на устройстве. В моём случае read(8192) - для флэхи и read(4096) - для HDD. Что, в общем, логично.<br />2. Массив байтов я получил (кривовато и медленно, но получил):</p><div class="codebox"><pre><code>var vFile=[];
with(new ActiveXObject(&#039;ADODB.Stream&#039;)){
  type=1;
  open(),loadFromFile(&#039;test&#039;);
// test - имя файлика (без расширения) для экспериментов
// лежит в папке скрипта, размер 20-30 байт, чтобы пошустрее,
// создаётся в hex редакторе, чтобы разные комбинации проверять
  while(!EOS)vFile.push(read(1));
  close();
}
WScript.echo(typeof(vFile[0]));</code></pre></div><p>Забавно то, что дальше этот массив средствами JS я обработать не смог. Тип элементов массива - unknown, поэтому JS не считает это ни строкой (никакие методы для строк не работают), ни чилом - арифметика тоже не пашет. По echo пытается показать соответствующий символ, но, если байт из диапазона 0x7f - 0x9f, не показывает ничего...</p>]]></content>
			<author>
				<name><![CDATA[Serge Yolkin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27503</uri>
			</author>
			<updated>2013-02-16T09:20:26Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=69556#p69556</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=69405#p69405" />
			<content type="html"><![CDATA[<p>[off]<br />На глаз - с десяток бинарников (.exe, .dll, ...) в свежеустановленной винде имеют реализации подобных алгоритмов (мне же всё равно, какой именно алгоритм). И, блин, из скриптов они недоступны! Видимо, вся безопасность сразу накроется медным тазом, если я узнаю контрольную сумму какого-нибудь файла.<br />[/off]</p><p>Может, где написано, что так нельзя? Я бы и не мучился. На MSDN и у них же в social ничего не обнаружил. Если там кто-нибудь зарегистрирован, задали бы вопрос...</p>]]></content>
			<author>
				<name><![CDATA[Serge Yolkin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27503</uri>
			</author>
			<updated>2013-02-12T17:39:38Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=69405#p69405</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=69402#p69402" />
			<content type="html"><![CDATA[<p>Пока не уверен в закономерности, но на W7Pro x32 - работает, на x64 - действительно работает в WScript&#039;32 (сам не догадался, думал - не работает), а вот на домашних (васик и премиум) - нет. Нет, говорит, такого скриптабельного объекта. Пробовал создавать System.Security.Cryptography.MD5CryptoServiceProvider, объект, вроде, создаётся, но не помнит собственных методов: по typeof говорит &quot;обжект&quot;, а методы не поддерживает.</p>]]></content>
			<author>
				<name><![CDATA[Serge Yolkin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27503</uri>
			</author>
			<updated>2013-02-12T17:24:23Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=69402#p69402</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=69394#p69394" />
			<content type="html"><![CDATA[<p>А у меня создаётся, но только если запускать скрипт 32-битной версией WScript (которая в SysWOW64). Видимо, класс существует только в 32-битном варианте.</p>]]></content>
			<author>
				<name><![CDATA[YMP]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=81</uri>
			</author>
			<updated>2013-02-12T14:03:32Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=69394#p69394</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=69392#p69392" />
			<content type="html"><![CDATA[<p>Опа! На семёрке объект CAPICOM.HashedData не создаётся. Т.е. стабильного способа получения контрольной суммы / хэша файла из скрипта в винде, похоже, нет. Прийдётся посмотреть на консольные утилиты...</p>]]></content>
			<author>
				<name><![CDATA[Serge Yolkin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27503</uri>
			</author>
			<updated>2013-02-12T13:53:43Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=69392#p69392</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=69355#p69355" />
			<content type="html"><![CDATA[<p>Ну просто безразмерное спасибо.<br />Вот что получилось:</p><div class="codebox"><pre><code>function hash(algorithm,file){
  var
   objHashedData=WScript.createObject(&#039;CAPICOM.HashedData&#039;),
   strAlgorithm,
   begin,
   end,
   time;

  objHashedData.algorithm=algorithm;

  switch(algorithm){
// алгоритмы упорядочены по быстродействию:
// MD4 — самый быстрый, MD2 — неприлично медленный
   case 2:strAlgorithm=&#039;MD4&#039;;break;    
   case 3:strAlgorithm=&#039;MD5&#039;;break;    
   case 0:strAlgorithm=&#039;SHA1&#039;;break;    
   case 4:strAlgorithm=&#039;SHA 256&#039;;break;    
   case 5:strAlgorithm=&#039;SHA 384&#039;;break;    
   case 6:strAlgorithm=&#039;SHA 512&#039;;break;    
   case 1:strAlgorithm=&#039;MD2&#039;;break;    
  }

  begin=new Date();

  with(new ActiveXObject(&#039;ADODB.Stream&#039;)){
    type=1;
    open();
    loadFromFile(file);
    while(!EOS)objHashedData.hash(read(1024));
    close();
  }

  end=new Date();
  time=end-begin;

  return(strAlgorithm+&#039; Hash: [&#039;+objHashedData.Value+&#039;]\n&#039;+time);
}

WScript.echo(hash(2,&#039;C:\\Windows\\System32\\MRT.exe&#039;));</code></pre></div><p>Получается - самый быстрый алгоритм - MD4, его и буду использовать...</p>]]></content>
			<author>
				<name><![CDATA[Serge Yolkin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27503</uri>
			</author>
			<updated>2013-02-11T10:33:44Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=69355#p69355</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=69350#p69350" />
			<content type="html"><![CDATA[<p>Как-то так (не проверялось):<br /></p><div class="codebox"><pre><code>while (!EOS) {
    objHashedData.Hash(Read(1024));
}
</code></pre></div>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2013-02-11T08:23:30Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=69350#p69350</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=69349#p69349" />
			<content type="html"><![CDATA[<p>Мда. То, что доктор прописал. И работает, вроде, шустро. Ещё раз огромное спасибо.<br />Надеюсь, полученая в ходе самостоятельных поисков информация хотя бы расширит мой кругозор...</p><p>Ещё один вопрос: хотел перевести пример на JScript, но наткнулся на незнакомую конструкцию (наверное, это смешно, но я бейсика не знаю и с такой конструкцией ранее не встречался)</p><div class="codebox"><pre><code>var
 objHashedData=WScript.createObject(&quot;CAPICOM.HashedData&quot;),
 objStream=WScript.createObject(&quot;ADODB.Stream&quot;);
objHashedData.Algorithm=3;
// SHA1    = 0
// MD2     = 1
// MD4     = 2
// MD5     = 3
// SHA 256 = 4
// SHA 384 = 5
// SHA 512 = 6

with(objStream){
  type=1;
  open();
  loadFromFile(&quot;Path\fileName.ext&quot;);

//    Следующий код надо перевести на JS:

//    Do Until .EOS
//        objHashedData.Hash .Read(1024)
//    Loop

  close();
}

WScript.echo(&quot;MD5 Hash: [&quot; &amp; objHashedData.Value &amp; &quot;]&quot;)</code></pre></div>]]></content>
			<author>
				<name><![CDATA[Serge Yolkin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27503</uri>
			</author>
			<updated>2013-02-11T08:08:35Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=69349#p69349</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=69343#p69343" />
			<content type="html"><![CDATA[<p><a href="http://forum.script-coding.com/viewtopic.php?id=4086">VBScript: Вычисление хэша MD5 файла</a>.</p>]]></content>
			<author>
				<name><![CDATA[alexii]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=1844</uri>
			</author>
			<updated>2013-02-10T21:36:01Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=69343#p69343</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[VBScript: Контрольная сумма, хэш и т.д.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=69342#p69342" />
			<content type="html"><![CDATA[<p>Возможно, я в очередной раз изобретаю велосипед, но два выходных, проведенных в гугле, яндексе и MSDN, вынуждают обратиться за помощью. Суть проблемы: необходимо из скрипта, по возможности быстро, получить некий уникальный идентификатор файла. CRCx, MDx, SHAx - всё равно. Можно даже что-нибудь экзотическое. Совместимость с чем-либо не интересует. Главное:<br />1. идентификатор должен измениться при любом изменении файла (маловероятные случаи с заменой всего содержимого файла на другое, но имеющее тот же хэш - не рассматриваем);<br />2. идентификатор должен зависеть только от содержимого файла, и не зависеть от его полного/краткого имени, дат и атрибутов;<br />3. поучать его надо из скрипта (предпочтительнее JScript), но средствами винды без дополнительных бинарных файлов. Без регистрации dll. Расчет средствами JS тоже не вариант: уж очень долго в скрипте выполняется побайтовая обработка файлов, а хотелось бы побыстрее.<br />Может, что-то подобное уже где-то было? Просто я не смог найти?<br />Сейчас есть решение, проверяющее размер и дату изменения. Работало около года, но на прошлой неделе этого оказалось недостаточно... Это я на случай, если кто хочет предложить проверку по размеру и дате. Такая проверка останется, а вот если и то, и другое совпадает - проверить ещё и на содержимое.</p>]]></content>
			<author>
				<name><![CDATA[Serge Yolkin]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=27503</uri>
			</author>
			<updated>2013-02-10T20:29:09Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=69342#p69342</id>
		</entry>
</feed>
