Google, Stripe и многие другие компании имеют открытый ключ API и секретный ключ API.
Легко генерировать случайные строки, но у меня вопрос: как я могу генерировать открытый и секретный ключи, хранить их и правильно их использовать?
Публичный ключ API должен сообщить, кто пользователь, а секрет - подтвердить его личность.
Мой поток выглядит следующим образом:
- Пользователь создает аккаунт
- Пользователь активирует услугу (собственноручно)
- Служба возвращает открытый и секретный ключ API (UARRHAtPtJcLxx5RmMWo9oTrca4gRt2k, C9YS7Mhzichq2vqBuRkNJxkNci5W2Xua)
- Пользователь использует открытый ключ на своем веб-сайте и закрытый ключ на стороне сервера
Я использую nodejs, и открытый ключ генерируется по требованию, когда пользователь запрашивает ключ API:
let public = await crypto.randomBytes(32).toString('base64');
Хранение секрета в базе данных было бы похоже на хранение пароля в виде открытого текста.
Я предполагаю, что мы не хотим этого, и это нужно как-то хешировать. Я генерирую «закрытый» ключ и хеширую его, например, используя argon2? Пользователь больше никогда не сможет увидеть свой ключ и ему нужно будет сразу его сохранить, это хорошая практика?
Я не смог найти много информации о том, как это должно работать.