Новости | FAQ | Авторы | Документация | В действии | Библиотека |
Инструменты | Полезные ссылки | Хостинги | Скачать | Примеры | Форум |
Sumo 27.02.2015 08:06
... signature = hash(string + secret). Секрет — это строка, которая известна только отправителю и получателю. Хешируюшую функцию надо брать стойкую и «посоленную». Парсеровские md5/sha1 не подойдут, надо брать math:crypt.@CLASS hydCoreSecurity ## Шифрование и работа с токенами. @BASE hydBaseModel @create[aOptions] ## aOptions.cryptKey — ключ шифрования ## aOptions.secretKey — ключ для подписи ^cleanMethodArgument[] ^BASE:create[$aOptions] ^pfAssert:isTrue(def $aOptions.cryptKey)[Не задан ключ шифрования.] ^pfAssert:isTrue(def $aOptions.secretKey)[Не задан ключ для подписи.] $_secretKey[$aOptions.secretKey] $_cryptKey[$aOptions.cryptKey] @encrypt[aString] ## Зашифровывает строку и кодирует ее в hex. $result[^CSQL.string{ select sql_no_cache hex(aes_encrypt('^taint[$aString]', '^taint[$_cryptKey]')) }] @decrypt[aString] ## Расшифровывает строку, закодированную методом encrypt. $result[^CSQL.string{ select sql_no_cache aes_decrypt(unhex('^taint[$aString]'), '^taint[$_cryptKey]') }] @makeToken[aTokenData;aOptions][locals] ## Формирует токен из данных и подписывает его. $result[^aTokenData.foreach[k;v]{$v}[|]] $result[^encrypt[${result}|^math:crypt[$result|$_secretKey;^$apr1^$]]] @parseAndValidateToken[aToken;aOptions][locals] ## Расшифровывает и валидирует токен. ## Возвращает хеш с данными токена или выбрасывает исключение. $result[^hash::create[]] $aToken[^decrypt[^aToken.trim[both]]] $lParts[^aToken.split[|;lv]] ^if($lParts < 2){^throw[invalid.token]} ^lParts.foreach[k;v]{ ^if($k == ($lParts - 1)){ $lSignature[$v.piece] ^break[] } $result.[$k][$v.piece] } $lData[^aToken.left(^aToken.length[] - ^lSignature.length[] - 1)] ^if(!def $lSignature || $lSignature ne ^math:crypt[${lData}|$_secretKey;$lSignature]){ ^throw[invalid.token] }