Просто чтобы быть в курсе.
Более новые версии могут делать некоторые простые преобразования автоматически
public class Source
{
public string String{ get; set; }
}
public class Target
{
public int Int { get; set; }
public decimal Decimal{ get; set; }
}
[Fact]
public void TestCustomMap()
{
Mapper.Initialize(cfg =>
cfg.CreateMap<Source, Target>()
.ForMember(dest => dest.Int, opt => opt.MapFrom(src => src.String))
.ForMember(dest => dest.Decimal, opt => opt.MapFrom(src => src.String)));
var target = Mapper.Instance.Map<Target>(new Source { String = "123" });
Assert.Equal(expected: 123, actual: target.Int);
Assert.Equal(expected: 123m, actual: target.Decimal);
//This will throw an exception
//Mapper.Instance.Map<Target>(new Source { String = "123.2" });
}
Суть радужных таблиц в том, что они создаются заранее и массово распространяются, чтобы сэкономить время вычислений для других - это занимает столько же long, чтобы генерировать радужные таблицы на лету, как если бы просто взломать комбинацию пароль + соль напрямую (поскольку фактически то, что делается при создании радужных таблиц, - это предварительный запуск вычислений для перебора хеша), таким образом, аргумент, что зная соль, которую кто-то может «создать радужную таблицу», является ложной.
Нет никакого смысла хранить соли в отдельном файле, если они 're для каждого пользователя - суть проблемы в том, чтобы просто сделать так, чтобы одна радужная таблица не могла взломать каждый пароль в БД.
Часто они добавляются к хешу и сохраняются в одном поле.
Нет необходимости хранить их отдельно - суть в том, чтобы использовать случайную соль для каждого пароля, чтобы единая радужная таблица не может использоваться против всего вашего набора хэшей паролей. При использовании случайных солей злоумышленник должен перебирать каждый хэш отдельно (или вычислять радужную таблицу для всех возможных солей - гораздо больше работы).
Если бы у вас было более безопасное место хранения, было бы разумно просто хранить хеши там.