2016-09-27 9 views
3

Я хочу защитить размещенные службы Rest, используя систему авторизации Token. Итак, я решил пойти с JWT-процессом. После следующей документации я смутился, как работает цифровая подпись. AFAIK нам нужно зашифровать закрытый ключ, используя SignatureAlgorithm. и для проверки этого нам нужен только открытый ключ в нашем приложении для конечного пользователя. Я сохраню открытый ключ в локальной базе данных Android.Как обеспечивается цифровая подпись JWT?

Теперь давайте поговорим об обратном проектировании. Если кто-то может получить доступ к базе данных клиента и выяснить, что такое открытый ключ. Теперь им просто нужно выяснить, какой сервер алгоритмов используется для цифровой подписи, и это очень просто сделать, просто расшифровав раздел заголовка.

Я что-то упустил? Если нет, то как JWT безопасен в использовании?

ответ

3

Я запутался, как цифровая подпись работает.

Действительно.

AFAIK нам необходимо зашифровать закрытый ключ, используя SignatureAlgorithm.

No. Вы должны шифровать данные и зашифровать его с секретный ключ. Обычно вы шифруете HMAC данных, чтобы сэкономить место.

и для его проверки нам нужен только открытый ключ в нашем приложении для конечного пользователя.

Исправить. Но вы проверяете, что эти данные были подписаны с этим закрытым ключом.

Теперь давайте поговорим об обратном проектировании. Если кто-то может получить доступ к базе данных клиента и выяснить, что такое открытый ключ. Теперь им просто нужно выяснить, какой сервер алгоритмов используется для цифровой подписи, и это очень просто сделать, просто расшифровав раздел заголовка.

Нет, потому что вы не зашифровали секцию заголовка. Вы зашифровали HMAC.

+0

Получил. Но при проверке подписанных данных нам нужно предоставить открытый ключ. Правильно? Следуя этому: 'https: // github.com/jwtk/jjwt' –

+0

Для обратной инженерии. Скажем, 'xxxx.yyy.zzz' - моя строка' JWT', разделенная символом '.'. Если я применил базовые 64 декодера в первой части строки, тогда он даст мне использованный алгоритм. Теперь, если я знаю открытый ключ, я не могу понять мой «секретный ключ»? –

+0

@AmitPal Конечно нет. В противном случае вся система государственного/частного ключей была бы бессмысленной. – EJP

-1

Android был основан на идее, что все приложения должны работать независимо друг от друга, а это означает, что одно приложение для Android не может попасть в процесс другого. Это, конечно, неверно, если устройство коренится, и в этом случае подлинность токена.

Кроме того, вам не нужно расшифровывать JWT, поскольку полезная нагрузка кодируется только base64. Любой, кто знает, как декодировать base64, сможет видеть заголовок и полезную нагрузку, которые вы отправляете. поэтому вы не ставите что-либо в полезной нагрузке, которая является личной (адреса электронной почты, пароли, номера кредитных карт). Если вы хотите включить личную информацию в полезную нагрузку, посмотрите на JWE; он шифрует полезную нагрузку, обеспечивая безопасность. Вернемся к основному вопросу: подпись будет терпеть неудачу, если тело было подделано. Дальнейшие вопросы о том, как асимметричные математические методы шифрования лучше подходят для сайта SE Mathematics.

Редактировать: Посмотрите на jwt.io за хороший обзор JWTs

+1

Это не зависит от меня.'JWT' использует шифрование' base64' для раздела заголовка и полезной нагрузки, и никто не может его подделать, пока у них не будет раздела 'security' для JWT. Мой вопрос заключается в том, как сделать безопасный раздел 'security' в' JWT', потому что кодирование и декодирование подписи зависят от частного и открытого ключа. –

+0

любой может декодировать, читать ** и ** заменять полезную нагрузку или заголовок модифицированными закодированными данными base64, но это не удастся, когда вы его проверите. Посмотрите https://jwt.io/introduction/ для советов по JWT и кто подпишет его в соответствии со стандартами RFC. – Corgs

+0

Да! Мы находимся на одной странице, но для расшифровки на стороне клиента нам нужен открытый ключ (пара секретного ключа, используемого во время генерации подписи). Для этого нам нужно хранить этот открытый ключ где-то на стороне клиента. Теперь я декомпилировал приложение и выяснил, что такое открытый ключ. Нелегко ли кому-то нарушить безопасность? –