使用加密算法的安全承载令牌

时间:2019-01-04 08:13:55

标签: c# asp.net-web-api encryption oauth

在使用Identity框架和Owin的WebApi项目中,授权和身份验证工作正常。下一步是我要使我的承载令牌更安全,并需要实现承载令牌的加密和解密。

在验证之前,加密的字符串将在Actionfilter中解密。有什么推荐的方法吗?我尝试了AES和DES的多种实现,但是我正在尝试实现任何建议的实现方式。

AES实现:

static byte[] Encrypt(string plainText, byte[] Key, byte[] IV) {  
        byte[] encrypted;  
        // Create a new AesManaged.    
        using(AesManaged aes = new AesManaged()) {  
            // Create encryptor    
            ICryptoTransform encryptor = aes.CreateEncryptor(Key, IV);  
            // Create MemoryStream    
            using(MemoryStream ms = new MemoryStream()) {  
                // Create crypto stream using the CryptoStream class. This class is the key to encryption    
                // and encrypts and decrypts data from any given stream. In this case, we will pass a memory stream    
                // to encrypt    
                using(CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write)) {  
                    // Create StreamWriter and write data to a stream    
                    using(StreamWriter sw = new StreamWriter(cs))  
                    sw.Write(plainText);  
                    encrypted = ms.ToArray();  
                }  
            }  
        }  
        // Return encrypted data    
        return encrypted;  
    }  
    static string Decrypt(byte[] cipherText, byte[] Key, byte[] IV) {  
        string plaintext = null;  
        // Create AesManaged    
        using(AesManaged aes = new AesManaged()) {  
            // Create a decryptor    
            ICryptoTransform decryptor = aes.CreateDecryptor(Key, IV);  
            // Create the streams used for decryption.    
            using(MemoryStream ms = new MemoryStream(cipherText)) {  
                // Create crypto stream    
                using(CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read)) {  
                    // Read crypto stream    
                    using(StreamReader reader = new StreamReader(cs))  
                    plaintext = reader.ReadToEnd();  
                }  
            }  
        }  
        return plaintext;  
    }  

1 个答案:

答案 0 :(得分:0)

是的。推荐的方法是不要这样做。应该没有理由这样做。

请记住OAuth / OpenID存在的原因。重点是分散式身份验证。这就是为什么这些标记被编码为base64的原因。这样,任何客户端都可以使用该第三方来标识用户。 (请注意,我没有写“授权”)。显然,用户应该给予同意,否则身份提供商将拒绝基于访问的访问。 (通过验证重定向网址或不知道客户端)

还要注意openId和OAuth之间的区别。声明是一个openID概念。 Json网络令牌的概念也来自OpenID(不是OAuth)。 OAuth没有可读的承载令牌。再次:请注意两个不同协议的目的。我试图在这里解释这些协议:https://medium.com/@abstarreveld/oauth-and-openid-explained-with-real-life-examples-bf40daa8049f

对于您的问题:不要加密承载令牌。您可以考虑使用参考令牌而不是jwt令牌。这样,读取这些令牌的内容就变得更加困难。如果您确实希望令牌不可读,请创建自己的JUST OAUTH OWIN实现。在此处使用范围而不是声明。

希望这会有所帮助!