public async Task <string> CryptAsync(string userId, string data) { var cypher = await strongKeyProvider.GetStrongKeyAsync(userId); var result = aes.Crypt(cypher.Secret.ToUrlSafeBase64(), data); return(result); }
public async Task <string> GetOrSetAesKeyAsync(string userId) { logger.LogInformation($"try to get {userId} cacheKey"); string cacheKey = CacheKeyFactories.GenerateAesKeyCache(userId); var result = await CacheGetString(cacheKey); if (result != null) { return(result.Aes); } var strongKey = await strongKeyProvider.GetStrongKeyAsync(userId); if (strongKey == null) { logger.LogInformation($"Key was not exist. User id: {userId}"); throw new ApiError(new ServerException("Internal server error")); } var cacheModel = new CryptCacheModel() { Aes = strongKey.Secret.ToUrlSafeBase64() }; await CacheSetString(cacheKey, cacheModel, TimeSpan.FromMinutes(5)); return(cacheModel.Aes); }
public async Task <IDictionary <string, string> > CryptMessageAsync(MessageBuildDto message) // крипт сообщений. используется для отправки сообщения от сервера { var strongKey = await strongKeyProvider.GetStrongKeyAsync(message.ReceiverId); string cryptedAesKey = aes.Crypt(strongKey.Secret.ToUrlSafeBase64(), message.Aes); var result = new ConcurrentDictionary <string, string>(); var tasks = new List <Task>(); var sessions = await sessionProvider.GetModelsBySearchPredicate(x => x.UserId == message.ReceiverId); foreach (var session in sessions) { tasks.Add(Task.Run(() => { var signMessage = new SignMessageDto() { MessageId = message.MessageId, CryptedText = message.Text, CryptedAes = cryptedAesKey, ReceiverId = message.ReceiverId, SenderId = message.SenderId, SessionId = message.SessionId, Created = DateTime.Now }; string sign = rsa.SignData(session.ServerPrivateKey, signMessage.ObjectToBytes()); var item = new MessageDto() { Message = signMessage, Sign = sign }; result.TryAdd(session.SessionId, JsonConvert.SerializeObject(item)); })); } await Task.WhenAll(tasks); return(result); }