5 Stimmen

Wie kann ich den Hash-Wert einer Benutzerdatei mit Javascript oder Flash ermitteln?

Was ich tun muss, ist eine Datei-Browser-Box auf einer Webseite, wo ein Benutzer wählt eine Datei von ihrem Computer und, durch Javascript (oder Flash, wenn nötig), eine Art von Hash zurückgegeben wird, wie CRC, MD5 oder SHA1. Ich würde es vorziehen, nicht die gesamte Datei auf den Webserver hochladen zu müssen, da ich davon ausgehe, dass hier einige ziemlich große Dateien verwendet werden.

Im Grunde mache ich ein Skript, das diese Werte mit einer Art META-Daten verknüpft, so dass die Dateien identifiziert werden können, ohne dass sie vollständig hochgeladen werden müssen.

Haben Sie eine Idee, wie ich das anstellen könnte? Es wäre einfach für mich, es auf der Serverseite zu tun, aber, wie ich schon sagte, es werden einige ziemlich große Dateien überprüft und ich möchte nicht zu viel von der Bandbreite des Servers verbrauchen.

5voto

euge1979 Punkte 769

Sie können dies mit Flash tun, vorausgesetzt, der Benutzer verfügt über Flash Player 10.

Hier ist ein tutorial

También: Lesen und Schreiben von lokalen Dateien im FP10

0 Stimmen

Wow, ist das nicht wirklich gefährlich?

1 Stimmen

Das Dialogfeld kann nur durch eine Benutzerinteraktion (z. B. einen Klick) ausgelöst werden. Lee Brimelow geht hier näher darauf ein. theflashblog.com/?p=423

2voto

bobince Punkte 512550

Dies ist traditionell mit JavaScript nicht möglich, aber es könnte sein, wenn die W3 Datei-Upload Spezies jemals ankommt.

Eine Variante ist in Firefox 3 verfügbar:

var content= input.files[0].getAsBinary();

Bei anderen Browsern müssten Sie auf Flash und/oder Server-seitiges Hashing zurückgreifen.

Hier ist eine zusätzliche JS-Implementierung von SHA-1 für Sie:

function sha_hexdigest(bytes) {
  var digest= sha_bytes(sha_calculate(sha_ints(bytes), bytes.length*8));
  var digits= '0123456789abcdef';
  var hex= '';
  for (var i= 0; i<digest.length; i++) {
    var c= digest.charCodeAt(i);
    hex+= digits.charAt((c>>4)&0xF) + digits.charAt(c&0xF);
  }
  return hex;
}

function sha_ints(bytes) {
  while (bytes.length%4!=0)
    bytes+= '\x00';
  var ints= new Array();
  for (var i= 0; i<bytes.length; i+= 4) {
    ints[ints.length]= (
      (bytes.charCodeAt(i)&0xFF)<<24 | (bytes.charCodeAt(i+1)&0xFF)<<16 |
      (bytes.charCodeAt(i+2)&0xFF)<<8 | (bytes.charCodeAt(i+3)&0xFF)
    ); }
  return ints;
}

function sha_bytes(ints) {
  var bytes= '';
  for (var i= 0; i<ints.length; i++)
    bytes+= String.fromCharCode((ints[i]>>24)&0xFF, (ints[i]>>16)&0xFF, (ints[i]>>8)&0xFF, ints[i]&0xFF)
  return bytes;
}

function sha_calculate(ints, bitn) {
  while (ints.length*32<=bitn) ints[ints.length]= 0;
  ints[ints.length-1]|= 1<<(31-bitn%32)
  while (ints.length%16!=14) ints[ints.length]= 0;
  ints[ints.length]= Math.floor(bitn/0x100000000);
  ints[ints.length]= bitn&0xFFFFFFFF;

  var h0= 1732584193, h1= -271733879, h2= -1732584194, h3= 271733878, h4= -1009589776;
  var a, b, c, d, e, f, k, temp, w= new Array(80);
  for(var inti= 0; inti<ints.length; inti+= 16) {
    a= h0; b= h1; c= h2; d= h3; e= h4;
    for (var i= 0; i<16; i++) w[i]= ints[inti+i];
    for (; i<80; i++) w[i]= sha_rol(w[i-3] ^ w[i-8] ^ w[i-14] ^ w[i-16], 1);

    for(var i= 0; i<80; i++) {
      switch (Math.floor(i/20)) {
        case 0: f= sha_add(1518500249, (b & c) | ((~b) & d)); break;
        case 1: f= sha_add(1859775393, b ^ c ^ d); break;
        case 2: f= sha_add(-1894007588, (b & c) | (b & d) | (c & d)); break;
        case 3: f= sha_add(-899497514, b ^ c ^ d); break;
      }
      temp= sha_add( sha_add(sha_rol(a, 5), w[i]), sha_add(e, f) );
      e= d; d= c; c= b; b= a; a= temp;
      c= sha_rol(c, 30);
    }

    h0= sha_add(h0, a); h1= sha_add(h1, b); h2= sha_add(h2, c); h3= sha_add(h3, d); h4= sha_add(h4, e);
  }
  return new Array(h0, h1, h2, h3, h4);
}

function sha_add(a, b) {
  var lsw= (a&0xFFFF) + (b&0xFFFF);
  var msw= (a>>16) + (b>>16) + (lsw>>16);
  return (msw<<16) | (lsw&0xFFFF);
}

function sha_rol(n, bits) {
  return (n<<bits) | (n>>>(32-bits));
}

0 Stimmen

Soweit ich weiß, gehört es mir. Es stammt aus einem Jahre alten Projekt, an das ich mich jetzt nur noch verschwommen erinnere, aber es sieht auf jeden Fall aus wie mein Stil zu dieser Zeit.

0 Stimmen

Ausgezeichnet! Ich habe vor kurzem selbst eine JS-Implementierung geschrieben. Ich würde vorschlagen, dass Sie sich selbst als Autor angeben, wenn das der Fall ist, sonst sieht es wie ein schamloses Plagiat aus.

0voto

BC. Punkte 23018

Dies ist mit Javascript nicht möglich, da es keinen Zugriff auf das Dateisystem gibt. Ich weiß, dass man das mit Silverlight machen kann. Vielleicht kann jemand mit Flash-Erfahrung antworten.

-3voto

Browser (d. h. JavaScript) können nicht auf das lokale Dateisystem zugreifen, Punkt. Wenn sie das könnten, wäre es ein Sicherheitsalbtraum.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X