Firebase "MD5" & BloddyCrytpo 不匹配

Firebase "MD5" & BloddyCrytpo's dont match

我正在尝试检查用户是否有本地文件。如果用户这样做,我会得到 bloodycrypto 从中生成 md5。然后我比较这两个值。一个来自 firebase 文件的元数据,另一个来自文件摘要的字节数组。他们从不匹配。在尝试生成我上传的文件的 md5 时,Firebase 会做一些不同的事情吗?

    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();
            }
    }

经过仔细检查(感谢 Organis),firebase 没有 return 正确的 MD5。它是什么?在我的存储控制台中,我没有看到 md5 属性,这是自动生成的吗?这些文件是通过 my rest API based off phantom's 指南上传的。

更新:按照 Organis 对方式的评论 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==

尝试将我得到的 md5 转换为 base64 会导致一致的不匹配结果。当我尝试解码所有内容时,是否有我遗漏或应用不正确的参数?

...So I would do something like

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

to follow your example right?

试试下面的代码,让您的 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();
}