2017-07-18 63 views
2

我正在尝试检查用户是否有本地文件。如果用户这样做,我会得到来制作一个md5。然后我比较这两个值。一个来自firebase文件的元数据,另一个来自消化文件的字节数组。他们从不匹配。当试图生成我上传的文件的md5时,Firebase会做些什么不同吗?Firebase“MD5”&BloddyCrytpo的不匹配

private function handleMetaSuccess(e:StorageReferenceEvent):void 
    { 
     trace("Meta succes for reference:" + this.name); 
     storageMetaData = e.metadata; 
     trace("reading file."); 
     fileBA = new ByteArray(); 
     var fs:FileStream = new FileStream(); 
      fs.open(Definitions.CACHE_DIRECTORY.resolvePath(name + ".jpg"), FileMode.READ) 
      fs.readBytes(fileBA); 
      fs.close(); 

      var byteHash:String = MD5.hashBytes(fileBA) 

      trace("Local hash = " + byteHash); //93b885adfe0da089cdf634904fd59f71 
      trace("Network hash = " + storageMetaData.md5Hash); //bo7XPotC+T5wmAcpagnXBw== 
      if (byteHash != storageMetaData.md5Hash) 
      { 
       trace("Not equal. Getting file."); //Always happens 
       getFile(); 
      } 
      else 
      { 
       loadFile(); 
      } 
    } 

经仔细inspetion(感谢Organis)火力不返回正确的MD5。它是什么?在我的存储控制台中,我没有看到md5属性,那么这是自动生成的?这些文件通过my rest API上传,基于phantom's指南。

更新:继Organis'关于设法采用MD5我得到并把它变成在一致的错配导致的base64结果的方式Firebase handle's MD5s

  var byteHash:ByteArray = new ByteArray(); 
      byteHash.writeUTFBytes(MD5.hashBytes(fileBA)); 

      var byteHashWithLength:ByteArray = new ByteArray(); 
      byteHashWithLength.writeUTF(MD5.hashBytes(fileBA)); 

      trace("Bytehash with length = " + Base64.encode(byteHashWithLength)); //ACAyMTMzYTdmYjczYTEzZDQ3ZDkzMTEyY2I1OWQyYTBmMg== 
      trace("Plain = " + Base64.encode(byteHash)); //OTNiODg1YWRmZTBkYTA4OWNkZjYzNDkwNGZkNTlmNzE= 
      trace("Storage md5 = " + storageMetaData.md5Hash); //UsoNl5sL1+aLiAhTOTBXyQ== 

评论。当我尝试解码所有内容时,是否有我缺少的参数或错误应用?

+0

** bo7XPotC + T5wmAcpagnXBw == **不是有效的MD5散列。 https://en.wikipedia.org/wiki/MD5 * 128位(16字节)MD5哈希(也称为消息摘要)通常表示为32个十六进制数字的序列。* – Organis

+0

嗯。之后怎么样了?它应该是一个散列。我正在使用distriq的Firebase Storage来获取md5哈希。通过该事件,使用getter storageMetaData.md5Hash相当于android的版本https://firebase.google.com/docs/storage/android/file-metadata#file_metadata_properties – quantomworks

+1

在firebase上找到另一个线程:https:// stackoverflow .com/questions/41380078/firebase-storage-getmetadata-issue看起来它的MD5实现是不同的。此外,还发现另一个页面:https://firebase.google.com/docs/reference/js/firebase.storage.FullMetadata *正在上传对象的Base64编码的MD5散列。*可能是因为它确实是Base64(MD5 (...))而不仅仅是MD5。 – Organis

回答

1

...所以我会做类似

var storageHash:String = Base64.decode(storageMetaData.md5Hash).toString(); 

跟随你的榜样吗?

试试这个代码下面,让您的storageMetaData.md5Hash从Base64的正确解码:

让我知道trace("storage hash : " + storageHash);结果,以检查是否你得到32个进制值的(预期)序列。

private function handleMetaSuccess(e:StorageReferenceEvent):void 
{ 
    trace("Meta succes for reference:" + this.name); 
    storageMetaData = e.metadata; 
    trace("reading file."); 
    fileBA = new ByteArray(); 
    var fs:FileStream = new FileStream(); 
    fs.open(Definitions.CACHE_DIRECTORY.resolvePath(name + ".jpg"), FileMode.READ) 
    fs.readBytes(fileBA); 
    fs.close(); 

    var byteHash:String = MD5.hashBytes(fileBA); //Local hash 

    var ba_storageHash:ByteArray = new ByteArray(); 
    ba_storageHash = Base64.decode(storageMetaData.md5Hash); //update ByteArray 
    var storageHash:String = bytesToHexString(ba_storageHash); //Hex values of bytes shown as String 


    trace("Network hash : " + storageMetaData.md5Hash); //bo7XPotC+T5wmAcpagnXBw== 
    trace("Local hash : " + byteHash); //93b885adfe0da089cdf634904fd59f71 
    trace("storage hash : " + storageHash); //what is result?? 

    if (byteHash != storageHash) 
    { 
     trace("Not equal. Getting file."); //Always happens 
     getFile(); 
    } 
    else 
    { 
     loadFile(); 
    } 
} 

// # Byte values (Hex) shown as (returned) String type 
private function bytesToHexString(input:ByteArray) : String 
{ 
    var strOut:String = ""; var strRead:String = ""; 
    input.position = 0; 
    var intBASize:uint = input.length; 

    for (var i:int = 0; i < intBASize; i++) 
    { 
     strRead = input.readUnsignedByte().toString(16); 

     if(strRead.length < 2) { strRead = "0" + strRead; } //# do padding 
     strOut += strRead ;  
    } 

    return strOut.toLowerCase(); //strOut.toUpperCase(); 
} 
+1

这会为我已保存的文件返回匹配散列值。谢谢。 – quantomworks