SaveLolliPoP
@SaveLolliPoP
1 / 0 = ∞

Как с помощью bcrypt зашифровать в строку?

Есть фронтенд на ангуляр, есть бэк на ноде.
Нужно с помощью bcrypt зашифровать json объект, для дальнейшее сохранение его в локальном хранилище, далее когда мне это необходимо, мне нужно его на фронте расшифровать.

Каким образом с помощью bcrypt мне можно зашифровать данные в строку, которую потом можно расшифровать зная секрет?

И где мне хранить безопасно секреты?
  • Вопрос задан
  • 115 просмотров
Пригласить эксперта
Ответы на вопрос 3
Zraza
@Zraza
Помог ответ? Отметь решением!
Bcrypt не подходит, шифрование одностороннее, т.е. исходные данные из зашифрованных не получить.
Есть библиотека с многими популярными алгоритмами шифрования, можно использовать, например, AES
https://github.com/brix/crypto-js
Под браузер тоже, кажется, работает (не тестил)
Где хранить - вопрос логики приложения. Если предполагается, что данные пользователя хранятся на сервере в зашифрованном виде - то лучше секреты нигде не хранить, а спрашивать у пользователя в момент расшифровки на клиенте.
Ответ написан
@grinat
Вот обратимый https://www.npmjs.com/package/mcrypt но на фронте это работать не будет, если только под wasm пересоберете. И смысла его на фронте хранить нет никакого, потому что если на фронт будет передан ключ для расшифровки, то любой сможет расшифровать.
Ответ написан
lastuniverse
@lastuniverse
Всегда вокруг да около IT тем
Адель Халитов, этого нельзя сделать с помощью bcrypt, разве что брутфорсом. Модуль bcrypt не шифрует данные а вычисляет хэш от текста без возможности последующей расшифровки.

документация к модулю BCrypt
API модуля BCrypt
genSaltSync(rounds, minor)
        rounds - [OPTIONAL] - the cost of processing the data. (default - 10)
        minor - [OPTIONAL] - minor version of bcrypt to use. (default - b)
    genSalt(rounds, minor, cb)
        rounds - [OPTIONAL] - the cost of processing the data. (default - 10)
        minor - [OPTIONAL] - minor version of bcrypt to use. (default - b)
        cb - [OPTIONAL] - a callback to be fired once the salt has been generated. uses eio making it asynchronous. If cb is not specified, a Promise is returned if Promise support is available.
            err - First parameter to the callback detailing any errors.
            salt - Second parameter to the callback providing the generated salt.
    hashSync(data, salt)
        data - [REQUIRED] - the data to be encrypted.
        salt - [REQUIRED] - the salt to be used to hash the password. if specified as a number then a salt will be generated with the specified number of rounds and used (see example under Usage).
    hash(data, salt, cb)
        data - [REQUIRED] - the data to be encrypted.
        salt - [REQUIRED] - the salt to be used to hash the password. if specified as a number then a salt will be generated with the specified number of rounds and used (see example under Usage).
        cb - [OPTIONAL] - a callback to be fired once the data has been encrypted. uses eio making it asynchronous. If cb is not specified, a Promise is returned if Promise support is available.
            err - First parameter to the callback detailing any errors.
            encrypted - Second parameter to the callback providing the encrypted form.
    compareSync(data, encrypted)
        data - [REQUIRED] - data to compare.
        encrypted - [REQUIRED] - data to be compared to.
    compare(data, encrypted, cb)
        data - [REQUIRED] - data to compare.
        encrypted - [REQUIRED] - data to be compared to.
        cb - [OPTIONAL] - a callback to be fired once the data has been compared. uses eio making it asynchronous. If cb is not specified, a Promise is returned if Promise support is available.
            err - First parameter to the callback detailing any errors.
            same - Second parameter to the callback providing whether the data and encrypted forms match [true | false].
    getRounds(encrypted) - return the number of rounds used to encrypt a given hash
        encrypted - [REQUIRED] - hash from which the number of rounds used should be extracted.


Если у вас возникает вопрос зачем такое вообще надо, то вот вам простой пример использования:

У вас есть некая авторизация пользователей принимающая логин и пароль. При этом в целях безопасности вам нельзя хранить пароль в БД или файле в открытом виде (вдруг злоумышленник сможет получить доступ к такому хранилищу и узнает пароли всех пользователей, включая администраторов). Для решения этой задачи и используются хэш-функции.
1. при установке нового пароля пользователю в БД записывается не сам пароль а его хэш
2. при авторизации, веденный пользователем пароль хэшируется тем же алгоритмом что и на шаге 1
3. хэш введенного пароля сравнивается в хэшем из БД. если совпали, то пользователь ввел верный пароль, если не совпали - пользователь посылается куда подальше )

PS: для реализации вашей задачи вы можете использовать одну из следующих библиотек:
RSA Javascript encryption
RSA and ECC in JavaScript
cryptico
или любую другую, реализующую принцип открытого/закрытого ключей. Таких библиотек множество
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы