| Новости | 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]
}