В случае MITM злоумышленник получит доступ к захэшированному паролю и это не помешает ему использовать его для успешной аутентификации. Проблема здесь в том, что для того, чтобы грамотно захэшировать пароль, нужна рандомная соль, что даст два разных значения на клиенте и на сервере. Как Вы решите эту проблему?
Upd: оказывается, arc4random_uniform кое-где заявляется как все еще криптографически стойкий, так что его использование — наверное не такая уж и дикая ошибка. В любом случае, в iOS для таких целей использование SecRandomCopyBytes является рекомендованным.
Спасибо за статью. Извините, что я сейчас буду писать эту критику в комментарии, а не Вам в личку, потому что важно, чтобы люди, которые совсем не разбираются в криптографии, не читали вот это вот и не следовали этим примерам.
Судя по всему Вы тоже просто прочли оригинальную статью и поверили ей на слово.
1.
Разработчики… создают запрос на сервер, который напрямую посылает логин и пароль.
Автор будет чрезвычайно удивлен, узнав, что это… не влияет ни на что! Хэширование, о котором он говорит, должно происходить на сервере при сохранении паролей в базу. И необходимо оно для того, чтобы злые хацкеры не смогли восстановить пароль, если они взломают сервак.
При посылке пароля, как и всех остальных запросов можно и нужно (сорвем же покровы!) использовать TLS. Нет разницы, будете вы посылать пароль в чистом или хэшированом виде. Если канал будет скомпрометирован, то человечек посередине в любом случае его перехватит и получит доступ к вашему аккаунту, хэшируй ты этот пароль на клиенте хоть миллиард раз.
2.
HKDF это функция формирования ключа
Почему использовался HKDF, а не PBKDF2, не scrypt? Просто в образовательных целях: это функции формирования ключа шифрования. То есть прямое назначение этих функций — это из короткого и неслучайного массива байт сделать более длинный и выглядящий как случайный. И "соль" играет здесь огромную роль.
3.
let salt = Array("salty".utf8)
сервер должен знать, что зашифровано в нашей переменной salt. Бэкэнд сможет сравнить ключи используя тот же алгоритм, чтобы идентифицировать пользователя.
Для того, чтобы все вышеперечисленное вообще имело хоть какой-то смысл, соль должна быть а) псевдослучайной, б) разной для каждого пароля. Наша ф-ция выглядит в общем виде так:
f(s, P, a) -> k
P — это пароль. Секретное, но НЕ случайное значение. s — соль. НЕ секретное, но псевдослучайное значение. a — алгоритм хэширования, используемый внутри функции формирования ключа. k — псевдослучайное значение на выходе.
Обатите внимание, что функция вернет псевдослучайное значение, если ну хотя бы один из ее параметров будет псевдослучайным. Откуда эта случайность вообще появится, если все ее параметры — это "salty" и (допустим) "mysuperpass"? Когда соль случайна, то на выходе каждый раз будет новое значение, даже для одних и тех же паролей.
Так вот, соль нужно сгенерировать с помощью криптографически стойкого генератора псевдослучайных значений. Затем прогнать это все дело через KDF, а уж затем сохранить и соль, и выходное значение в базу, если уж так хочется.
Как же сгенерировать по-настоящему псевдослучайное значение? Нужно где-то взять генератор, сгенерить это значение определенной длины, как того требует выбранный Вами алгоритм. Автор использует какой-то CryptoSwift? Что ж посмотрим, где у него там генератор, заходим на https://github.com/krzyzanowskim/CryptoSwift, на главной странице нет ничего про это. Смотрим исходники, видим файл RandomBytesSequence.swift, смотрим содержимое:
struct RandomBytesSequence: Sequence {
let size: Int
func makeIterator() -> AnyIterator<UInt8> {
var count = 0
return AnyIterator<UInt8>.init { () -> UInt8? in
//...
#if os(Linux) || os(Android) || os(FreeBSD)
//...
#else
return UInt8(arc4random_uniform(UInt32(UInt8.max) + 1))
#endif
}
}
}
Я даже не знаю, стоит ли этот arc4random_uniform комментировать. Использование? Например, файл Cryptors.swift:
extension Cryptors {
public static func randomIV(_ blockSize: Int) -> Array<UInt8> {
var randomIV: Array<UInt8> = Array<UInt8>()
randomIV.reserveCapacity(blockSize)
for randomByte in RandomBytesSequence(size: blockSize) {
randomIV.append(randomByte)
}
return randomIV
}
Вот такой вот у нас "рэндомный" IV получился.
Не буду вдаваться в подробности, просто не используйте это либу никогда и ни за что. Почитайте лучше про CSPRNG.
4.
Ну и финальное. Если Вы будете хранить пароль в Keychain, этого будет вполне достаточно, чтобы знать, что он уже зашифрован. Эппловская "свзяка ключей" как раз и использует KDF для того, чтобы зашифровать ВСЕ ваши данные, которые вы в этой связке храните.
Поэтому все действия, описанные в этой статье (кроме того, что не нужно хранить пароли в NSUserDefaults), лишние. И, судя по всему, даже вредные.
Никак. Похоже, переход в виртуальную реальность — это тот самый культурный шок, с которым не сможет примириться наше поколение. Когда виртуальность и реальность станут совершенно неотличимы друго от друга, человечеству придется пересмотреть такое количество фундаментальных представлений о себе и о мире, что, похоже, старые правила просто не будут работать.
Есть такой кинорежиссер очень известный, зовут Квентин Тарантино. Тарантиновщина — это квинтэссенция постмодернизма в популярном кино.
Я воспринимаю Тарантино, как интересную "артистическую" нейтронную сеть. Этот человек был одержим кино, он "натренировал" себя на сумасшедшем количестве фильмов. И в конечном итоге, немного разобравшись, что к чему с точки зрения продакшна, начал клепать собственные пленки, которые, в чем он неоднократно сам признавался, являлись по сути нарезкой поглощенного им контента.
Мне доводилось читать сценарий "Django Unchained" — там черным по белому пишется "показывать крупным планом как в фильме таком-то", "музыка нарастает как в фильме таком-то" и так далее.
Я это все к чему. Вполне представляю ситуацию, что из нейронки можно "воспитать" вот такого Тарантино.
Важно понимать, что наше "this is bad" воспринимается ими не просто как неуместная прямолинейность, а как практически переход на личности или, что еще хуже, как открытое нежелание работать. Дело здесь не в ранимости, а просто в разных порогах восприятия грубости.
И если в русскоязычной беседе кто-то вместо "Не, не сработает" скажет "Не неси чушь", это также будет воспринято как нарочито агрессивное поведение. Просто пороги разные в силу сложившихся норм.
Здесь дело все в том, к чему ты привык. Я совсем немного прожил в Северной Америке, но уже заметил и за собой изменение в восприятии. Множество людей (просто так) улыбаются тебе при встрече — местная специфика. И тогда человек, который не улыбается, уже воспринимается как заранее негативно настроенный или не желающий с тобой иметь дело.
Все современные человекоподобные роботы страдают важным недостатком — они жуткие. С этой проблемой сталкиваются многие 3D-аниматоры и хорошо ее обходят: они не делают моделей похожих на настоящих людей. Вспомните ювенилизацию персонажей-человеков и их нарочито ненастоящие пропорции во всех популярных современных мультфильмах.
Если кратко, то на определенном этапе "похожести" робота или 3D-модели наблюдающему становится не по себе. Создается ощущение, что это труп, который по каким-то причинам шевелится. Возможно, рано или поздно удастся избавиться от этого артефакта, но пока все такие роботы воспринимаются среднестатистическим человеком как "зловещие".
Я тоже читал биографию Маска и знаком с описываемыми Вами событиями. Я к тому больше, что один будет плакаться на судьбу и плохое отношение со стороны отца и сверстников, а другой рискнет в 17 "вернуться" на малую родину. Как Вы правильно заметили, он выбрал этот путь, потому что понимал, что там вся индустрия.
Его история, кстати, действительно необычная. Семья там была очень незаурядная, а первую контору он основал с братом. И много-много интересных людей его окружали на протяжение жизни. Мне вообще кажется, что успех именно заключается в окружении себя правильными людьми. Если взять того же банального Джобса, то держаться за Возняка было для него в свое время одним из самых верных стратегических решений.
Тут еще надо добавить, что эти самые "интересные" люди вокруг тебя вряд ли будут собираться, если сам ты неинтересен.
Маск со своим космическим проектом носился как дурень с писанной торбой по всей Долине. И даже пытался в России ракетку прикупить. Непохоже на "в нужном месте". Больше похоже на то, что нужно искать возможности, а не ждать, пока они тебе сами в руки приплывут. Между диваном и задницей, как известно, доллар не пролетает.
В смысле? Мы же можем что-то понять или познать только через наши органы чувств. Стало быть тогда любое восприятие чего бы то ни было можно продолжать приписывать симуляции.
Скользковатый лед. А что является критерием «сознания» для системы? Верховное животное-человек, как единственный носитель сознания? Или сознание по мере эволюции видов вдруг всплывает в мозгу какой-нибудь мышки? Будет ли тогда система просчитывать результаты для сознания этой мышки? В какой момент это «просто животное», а в какой — уже гордый носитель сознания?
У меня совсем нет уверенности в существовании каких-то ученых, как и Вас. Хотя, если я с Вами общаюсь, и раз есть объекты и субъект взаимодействия, какая разница, «натоящие» они или нет. И что вообще есть настоящее?
Мне кажется, надстраивая еще один слой абстракции в решении проблемы поиска смысла жизни, мы обманываем себя, придумывая мнимые пределы для познания. Например: идеи с симуляцией, первичность духа, навящивая уверенность об уникальной роли сознания во всеобщем бытии.
Придумывание дополнительных метамиров никак не приближает нас ни к какому ответу. Даже, если мы докажем, что живем в «симуляции», это сразу повлечет вопросы о том, кто ее создал. Что возвращает нас к креационистским теориям. А это освобождает от бремени неспособности осознать смысл бытия, перекладывая всю отвественность на высшее существо. Это натуральный «божественный скачок»: при невозможности осознать смысл жизни, единственным логическим выводом оказывается божественный замысел.
Все ок, я не утверждал, что Вы это сказали :) Просто считаю, что мысль об особенном положении человека в этом мире — это то, на что мы все время натыкаемся, потому что нам кажется, что мир крутится вокруг нас. По-моему, это возвращает нас к идее типа "Бог создал человека и ставит над ним эксперименты". Это, безусловно, вполне может быть и так. Мне просто кажется, что эта идея связывает нам руки в попытках понять, что на самом деле происходит.
Мы пишем игры как раз с упором на игроков. Ради них-то они и делаются. Тогда в контексте дискуссии то, что вы описываете, — это антропоцентризм. Мы, как люди, привыкли видеть во всем связь именно с нашим восприятием. Тогда получается, что мир действительно крутится вокруг нас и ради нас, и уж очень я в этом сомневаюсь.
Пускай. Но тогда это какая-то антропоцентричная позиция, извините. Если так, то получается, что система создана исключительно ради тех, кто ее будет пытаться наблюдать изнутри.
Если взять ваш пример с deep-learning сетями, то получается как раз наоборот. И это мне кажется весьма вероятным, хотя я могу дико заблуждаться: создатель нашей системы не может полностью проконтролировать то, что в ней происходит. Происходит запуск с какими-то настройками, а там уже все течет само собой. Ну и плюс всякие случайности на низком уровне, как раз, чтобы не просчитывать.
Как система, по-вашему, понимает, когда происходит эксперимент, а когда нет? Она явно не будет следить за действиями конкретных ученых. Ей бы тогда пришлось заранее знать, что тот или иной ученый захочет сейчас провести эксперимент. Тогда можно было бы предположить, что она настолько всемогуща, что проще было бы вообще не допустить возникновения таких вот ученых.
Или вы хотите сказать, что она может легко отличить действия "наблюдателя" от своих запрограммированных взаимодействий? Но я, честно говоря, не могу представить, за счет каких механизмов это стало бы для нее возможно. Не может же она помечать, допустим, какие-то бозоны, как "вот сейчас находящиеся в состоянии эксперимента"?
Боюсь, одним восприятием и дуркой для тех, у кого оно другое, все же не ограничивается дело. Вроде не было еще документировано случаев, когда человек, который нагаллюцинировал себе наличие крыльев и спрыгнул с окна, таки начал этими крыльями махать и пересел на соседнее дерево. Обычно они шлепаются о землю, и законы физики (хотя бы внешнего мира) для них сохраняются.
Спасибо за статью. Извините, что я сейчас буду писать эту критику в комментарии, а не Вам в личку, потому что важно, чтобы люди, которые совсем не разбираются в криптографии, не читали вот это вот и не следовали этим примерам.
Судя по всему Вы тоже просто прочли оригинальную статью и поверили ей на слово.
1.
Автор будет чрезвычайно удивлен, узнав, что это… не влияет ни на что! Хэширование, о котором он говорит, должно происходить на сервере при сохранении паролей в базу. И необходимо оно для того, чтобы злые хацкеры не смогли восстановить пароль, если они взломают сервак.
При посылке пароля, как и всех остальных запросов можно и нужно (сорвем же покровы!) использовать TLS. Нет разницы, будете вы посылать пароль в чистом или хэшированом виде. Если канал будет скомпрометирован, то человечек посередине в любом случае его перехватит и получит доступ к вашему аккаунту, хэшируй ты этот пароль на клиенте хоть миллиард раз.
2.
Почему использовался HKDF, а не PBKDF2, не scrypt? Просто в образовательных целях: это функции формирования ключа шифрования. То есть прямое назначение этих функций — это из короткого и неслучайного массива байт сделать более длинный и выглядящий как случайный. И "соль" играет здесь огромную роль.
3.
Для того, чтобы все вышеперечисленное вообще имело хоть какой-то смысл, соль должна быть а) псевдослучайной, б) разной для каждого пароля. Наша ф-ция выглядит в общем виде так:
P
— это пароль. Секретное, но НЕ случайное значение.s
— соль. НЕ секретное, но псевдослучайное значение.a
— алгоритм хэширования, используемый внутри функции формирования ключа.k
— псевдослучайное значение на выходе.Обатите внимание, что функция вернет псевдослучайное значение, если ну хотя бы один из ее параметров будет псевдослучайным. Откуда эта случайность вообще появится, если все ее параметры — это
"salty"
и (допустим)"mysuperpass"
? Когда соль случайна, то на выходе каждый раз будет новое значение, даже для одних и тех же паролей.Так вот, соль нужно сгенерировать с помощью криптографически стойкого генератора псевдослучайных значений. Затем прогнать это все дело через KDF, а уж затем сохранить и соль, и выходное значение в базу, если уж так хочется.
Как же сгенерировать по-настоящему псевдослучайное значение? Нужно где-то взять генератор, сгенерить это значение определенной длины, как того требует выбранный Вами алгоритм. Автор использует какой-то
CryptoSwift
? Что ж посмотрим, где у него там генератор, заходим на https://github.com/krzyzanowskim/CryptoSwift, на главной странице нет ничего про это. Смотрим исходники, видим файлRandomBytesSequence.swift
, смотрим содержимое:Я даже не знаю, стоит ли этот arc4random_uniform комментировать. Использование? Например, файл
Cryptors.swift
:Вот такой вот у нас "рэндомный" IV получился.
Не буду вдаваться в подробности, просто не используйте это либу никогда и ни за что. Почитайте лучше про CSPRNG.
4.
Ну и финальное. Если Вы будете хранить пароль в Keychain, этого будет вполне достаточно, чтобы знать, что он уже зашифрован. Эппловская "свзяка ключей" как раз и использует KDF для того, чтобы зашифровать ВСЕ ваши данные, которые вы в этой связке храните.
Поэтому все действия, описанные в этой статье (кроме того, что не нужно хранить пароли в NSUserDefaults), лишние. И, судя по всему, даже вредные.
Никак. Похоже, переход в виртуальную реальность — это тот самый культурный шок, с которым не сможет примириться наше поколение. Когда виртуальность и реальность станут совершенно неотличимы друго от друга, человечеству придется пересмотреть такое количество фундаментальных представлений о себе и о мире, что, похоже, старые правила просто не будут работать.
Вы во многом правы.
Я воспринимаю Тарантино, как интересную "артистическую" нейтронную сеть. Этот человек был одержим кино, он "натренировал" себя на сумасшедшем количестве фильмов. И в конечном итоге, немного разобравшись, что к чему с точки зрения продакшна, начал клепать собственные пленки, которые, в чем он неоднократно сам признавался, являлись по сути нарезкой поглощенного им контента.
Мне доводилось читать сценарий "Django Unchained" — там черным по белому пишется "показывать крупным планом как в фильме таком-то", "музыка нарастает как в фильме таком-то" и так далее.
Я это все к чему. Вполне представляю ситуацию, что из нейронки можно "воспитать" вот такого Тарантино.
Важно понимать, что наше "this is bad" воспринимается ими не просто как неуместная прямолинейность, а как практически переход на личности или, что еще хуже, как открытое нежелание работать. Дело здесь не в ранимости, а просто в разных порогах восприятия грубости.
И если в русскоязычной беседе кто-то вместо "Не, не сработает" скажет "Не неси чушь", это также будет воспринято как нарочито агрессивное поведение. Просто пороги разные в силу сложившихся норм.
Здесь дело все в том, к чему ты привык. Я совсем немного прожил в Северной Америке, но уже заметил и за собой изменение в восприятии. Множество людей (просто так) улыбаются тебе при встрече — местная специфика. И тогда человек, который не улыбается, уже воспринимается как заранее негативно настроенный или не желающий с тобой иметь дело.
Все современные человекоподобные роботы страдают важным недостатком — они жуткие. С этой проблемой сталкиваются многие 3D-аниматоры и хорошо ее обходят: они не делают моделей похожих на настоящих людей. Вспомните ювенилизацию персонажей-человеков и их нарочито ненастоящие пропорции во всех популярных современных мультфильмах.
У этого когнитивного эффекта есть название: Uncanny Valley, или Зловещая Долина. Вот здесь можно почитать: https://ru.wikipedia.org/wiki/Зловещая_долина
Если кратко, то на определенном этапе "похожести" робота или 3D-модели наблюдающему становится не по себе. Создается ощущение, что это труп, который по каким-то причинам шевелится. Возможно, рано или поздно удастся избавиться от этого артефакта, но пока все такие роботы воспринимаются среднестатистическим человеком как "зловещие".
Должны собираться, почему нет. Вопрос потом все равно будет сводиться к тому, что ты будешь с этими деньгами делать потом.
Я тоже читал биографию Маска и знаком с описываемыми Вами событиями. Я к тому больше, что один будет плакаться на судьбу и плохое отношение со стороны отца и сверстников, а другой рискнет в 17 "вернуться" на малую родину. Как Вы правильно заметили, он выбрал этот путь, потому что понимал, что там вся индустрия.
Его история, кстати, действительно необычная. Семья там была очень незаурядная, а первую контору он основал с братом. И много-много интересных людей его окружали на протяжение жизни. Мне вообще кажется, что успех именно заключается в окружении себя правильными людьми. Если взять того же банального Джобса, то держаться за Возняка было для него в свое время одним из самых верных стратегических решений.
Тут еще надо добавить, что эти самые "интересные" люди вокруг тебя вряд ли будут собираться, если сам ты неинтересен.
Маск со своим космическим проектом носился как дурень с писанной торбой по всей Долине. И даже пытался в России ракетку прикупить. Непохоже на "в нужном месте". Больше похоже на то, что нужно искать возможности, а не ждать, пока они тебе сами в руки приплывут. Между диваном и задницей, как известно, доллар не пролетает.
В смысле? Мы же можем что-то понять или познать только через наши органы чувств. Стало быть тогда любое восприятие чего бы то ни было можно продолжать приписывать симуляции.
Мне кажется, надстраивая еще один слой абстракции в решении проблемы поиска смысла жизни, мы обманываем себя, придумывая мнимые пределы для познания. Например: идеи с симуляцией, первичность духа, навящивая уверенность об уникальной роли сознания во всеобщем бытии.
Придумывание дополнительных метамиров никак не приближает нас ни к какому ответу. Даже, если мы докажем, что живем в «симуляции», это сразу повлечет вопросы о том, кто ее создал. Что возвращает нас к креационистским теориям. А это освобождает от бремени неспособности осознать смысл бытия, перекладывая всю отвественность на высшее существо. Это натуральный «божественный скачок»: при невозможности осознать смысл жизни, единственным логическим выводом оказывается божественный замысел.
Все ок, я не утверждал, что Вы это сказали :) Просто считаю, что мысль об особенном положении человека в этом мире — это то, на что мы все время натыкаемся, потому что нам кажется, что мир крутится вокруг нас. По-моему, это возвращает нас к идее типа "Бог создал человека и ставит над ним эксперименты". Это, безусловно, вполне может быть и так. Мне просто кажется, что эта идея связывает нам руки в попытках понять, что на самом деле происходит.
Мы пишем игры как раз с упором на игроков. Ради них-то они и делаются. Тогда в контексте дискуссии то, что вы описываете, — это антропоцентризм. Мы, как люди, привыкли видеть во всем связь именно с нашим восприятием. Тогда получается, что мир действительно крутится вокруг нас и ради нас, и уж очень я в этом сомневаюсь.
Пускай. Но тогда это какая-то антропоцентричная позиция, извините. Если так, то получается, что система создана исключительно ради тех, кто ее будет пытаться наблюдать изнутри.
Почему бы и нет. Но как, Холмс?
Если взять ваш пример с deep-learning сетями, то получается как раз наоборот. И это мне кажется весьма вероятным, хотя я могу дико заблуждаться: создатель нашей системы не может полностью проконтролировать то, что в ней происходит. Происходит запуск с какими-то настройками, а там уже все течет само собой. Ну и плюс всякие случайности на низком уровне, как раз, чтобы не просчитывать.
Вам и Eldhenn:
Как система, по-вашему, понимает, когда происходит эксперимент, а когда нет? Она явно не будет следить за действиями конкретных ученых. Ей бы тогда пришлось заранее знать, что тот или иной ученый захочет сейчас провести эксперимент. Тогда можно было бы предположить, что она настолько всемогуща, что проще было бы вообще не допустить возникновения таких вот ученых.
Или вы хотите сказать, что она может легко отличить действия "наблюдателя" от своих запрограммированных взаимодействий? Но я, честно говоря, не могу представить, за счет каких механизмов это стало бы для нее возможно. Не может же она помечать, допустим, какие-то бозоны, как "вот сейчас находящиеся в состоянии эксперимента"?
Боюсь, одним восприятием и дуркой для тех, у кого оно другое, все же не ограничивается дело. Вроде не было еще документировано случаев, когда человек, который нагаллюцинировал себе наличие крыльев и спрыгнул с окна, таки начал этими крыльями махать и пересел на соседнее дерево. Обычно они шлепаются о землю, и законы физики (хотя бы внешнего мира) для них сохраняются.