Я использую шаблон CQRS в архитектуре Onion, шифрую личные данные пользователя, такие как адрес электронной почты, номер телефона и адрес, и сохраняю их в базе данных. Я не мог прийти к выводу, следует ли мне шифровать каждую информацию отдельно или если сделать это все сразу, я смогу получить более точный и оптимизированный результат. Можете ли вы высказать мне свое мнение по этому поводу?
Вот часть моего кода, которую я зашифровал один за другим:
createUserDto.Email = await _cryptoHelperService.EncryptString(request.Email);
createUserDto.Address = await _cryptoHelperService.EncryptString(request.Address);
createUserDto.GSM = await _cryptoHelperService.EncryptString(request.GSM);
createUserDto.GSMPersonal = await _cryptoHelperService.EncryptString(request.GSMPersonal);
Мой метод параллельного шифрования, который я использовал сразу:
private async Task EncryptAndAssignAsync(Action propertySetter, string value)
{
var encryptedValue = await _cryptoHelperService.EncryptString(value);
propertySetter(encryptedValue);
}
var encryptTasks = new List
{
EncryptAndAssignAsync(val => createUserDto.Email = val, request.Email),
EncryptAndAssignAsync(val => createUserDto.Address = val, request.Address),
EncryptAndAssignAsync(val => createUserDto.GSM = val, request.GSM),
EncryptAndAssignAsync(val => createUserDto.GSMPersonal = val, request.GSMPersonal)
};
await Task.WhenAll(encryptTasks);
Вот и весь метод:
public class CreateUserCommandHandler : IRequestHandler
{
private readonly IUserService _userService;
private readonly ICryptographyService _cryptoHelperService;
private readonly IMapper _mapper;
public CreateUserCommandHandler(IUserService userService, ICryptographyService cryptoHelperService, IMapper mapper)
{
_userService = userService;
_cryptoHelperService = cryptoHelperService;
_mapper = mapper;
}
private async Task EncryptAndAssignAsync(Action propertySetter, string value)
{
var encryptedValue = await _cryptoHelperService.EncryptString(value);
propertySetter(encryptedValue);
}
public async Task Handle(CreateUserCommandRequest request, CancellationToken cancellationToken)
{
var startTime = DateTime.UtcNow;
OptResult response = new OptResult();
return await ExceptionHandler.HandleOptResultAsync(async () =>
{
var createUserDto = _mapper.Map(request);
createUserDto.Guid = Guid.NewGuid().ToString();
createUserDto.Email = await _cryptoHelperService.EncryptString(request.Email);
createUserDto.Address = await _cryptoHelperService.EncryptString(request.Address);
createUserDto.GSM = await _cryptoHelperService.EncryptString(request.GSM);
createUserDto.GSMPersonal = await _cryptoHelperService.EncryptString(request.GSMPersonal);
var encryptTasks = new List
{
EncryptAndAssignAsync(val => createUserDto.Email = val, request.Email),
EncryptAndAssignAsync(val => createUserDto.Address = val, request.Address),
EncryptAndAssignAsync(val => createUserDto.GSM = val, request.GSM),
EncryptAndAssignAsync(val => createUserDto.GSMPersonal = val, request.GSMPersonal)
};
await Task.WhenAll(encryptTasks);
var createdUser = await _userService.CreateAsync(createUserDto);
string DescryptedEmail = await _cryptoHelperService.DecryptString(createUserDto.Email);
string DescryptedGSM = await _cryptoHelperService.DecryptString(createUserDto.GSM);
var endTime = DateTime.UtcNow;
// Geçen süreyi hesapla
var elapsedTime = endTime - startTime;
Console.WriteLine($"İşlem tamamlandı. Geçen süre: {elapsedTime.TotalMilliseconds} ms");
if (createUserDto != null)
{
response.Succeeded = true;
response.Data = new CreateUserCommandResponse
{
Id = createUserDto.Guid,
UserName = createUserDto.UserName,
Email = DescryptedEmail,
GSM = DescryptedGSM,
};
}
else
{
response.Succeeded = false;
response.Message = "User creation failed.";
}
return response;
});
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... rocess-the