2017-09-26 60 views
1

我对.net相当陌生,并对DataProtector有疑问。在.net中缩短DataProtection加密长度?

当没有任何配置使用DataProtector.Protect时,产生的加密对于我需要传递给它的API来说太长了,我在想如果使用配置方法(如看到here)会有帮助吗?我试图在类中的下列地方,我需要保护的数据:

var serviceCollection = new ServiceCollection(); 
      serviceCollection.AddDataProtection() 
       .UseCustomCryptographicAlgorithms(new ManagedAuthenticatedEncryptionSettings() 
       { 
        // a type that subclasses SymmetricAlgorithm 
        EncryptionAlgorithmType = typeof(Aes), 

        // specified in bits 
        EncryptionAlgorithmKeySize = 128, 

        // a type that subclasses KeyedHashAlgorithm 
        ValidationAlgorithmType = typeof(HMACSHA256) 
       }); 

      var services = serviceCollection.BuildServiceProvider(); 
      _protector = services.GetDataProtector("MyClass.v1"); 

var protect = _protector.Protect(JsonConvert.SerializeObject(myData)); 

然而,即使从默认256改变EncryptionAlgorithmKeySize到最小128之后,“保护”仍然导致相同长度的加密这使我认为配置不工作或配置不会影响加密长度。

有谁知道这样做是正确的方式还是有更好的方法来减少加密长度?

例如,一个简单的9个字符的字符串会被加密为134个字符。

任何帮助非常感谢,谢谢!

+0

这听起来确实不错。为什么要将加密的数据从机器传输出去,为什么您要发送的API的长度有限? – CodeCaster

+0

@CodeCaster数据包含防伪令牌,但API只允许来回发送/传递500个字符,因此只是想知道是否有可配置的方法来限制加密长度。 –

回答

0

DPAPI旨在保护静止数据,而不是传输数据。

Ryan Dobbs是正确的,上面(或下面?我无法弄清楚StackOverflow是如何分类未接受的答案的......),削弱你的加密以获得更小的有效载荷是一个非常糟糕的主意。解决这个问题的正确方法是确保连接(TLS风格的SSL),然后你可以发送明文,或者(正如Ryan所建议的)在发送者和接收者都可以访问的地方放置一个正确加密的有效载荷。

但是为了更直接地回答你的问题,有效载荷的大小是由哈希函数控制的。加密密钥大小只会告诉您加密算法的密码复杂性 - 加密有多难。表示HMACSHA256的部分是SHA-256哈希,这意味着它生成一个256位输出。

MD5是128位,但它通常不安全(只适用于校验和)。

该文档显示密钥大小和散列大小必须相同,因此您无法使用SHA转至128位。可用的最短SHA是旧的SHA1算法(HMACSHA1),它是160位,但期望小于256位的任何内容都将不安全。 SHA2算法产生HMACSHA256HMACSHA512