在使用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;
}
答案 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实现。在此处使用范围而不是声明。
希望这会有所帮助!