0

我试图弄清楚如何解密在以下帖子中创建的下载令牌https://stackoverflow.com/a/4324115/487892

public static string GetDownloadToken(int fileId)
{
    byte[] idbytes = BitConverter.GetBytes(fileId); // 4 bytes 
    byte[] dateTimeBytes = BitConverter.GetBytes(DateTime.Now.ToBinary()); // 8 bytes
    byte[] buffer = new byte[16]; // minimum for an encryption block 
    string password = "password";

    byte[] passwordBytes = Encoding.ASCII.GetBytes(password);
    Array.Copy(idbytes, 0, buffer, 0, idbytes.Length);
    Array.Copy(dateTimeBytes, 0, buffer, idbytes.Length, dateTimeBytes.Length);
    byte[] encryptedBuffer = new byte[256]; 
    using (SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
    {
        int count = sha1.TransformBlock(buffer, 0, buffer.Length, encryptedBuffer, 0);
        return Convert.ToBase64String(encryptedBuffer, 0, count);
    }
}

我的主要兴趣是如何取回日期,以便可以将其与当前日期进行比较,以便在一段时间后使令牌过期?这不是在做单向哈希吗?

4

1 回答 1

4

这里的“加密”并不是真正的加密,而是“散列”。通过加密,您可以加密(使数据不可读)和解密(使其再次可读)。

散列的过程是不可逆的,即您不能从散列函数计算的值中检索原始数据,在本例中为 sha1.TransformBlock(..)。

如果你真的想用解密的能力进行加密,你需要使用不同的机制——即不是散列函数。

这是一个非常详细的 SO 链接,它提供了更多信息:哈希和加密算法之间的基本区别

对我来说,您的选择似乎是:

  1. 使用加密算法而不是散列算法
  2. 更改方法以返回包含“encryptedBuffer”作为日期/时间对象作为成员的对象类型
于 2012-09-19T18:45:01.803 回答