parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

Самый простой способ подписи...

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]
  }