Grails: шифрование параметров запроса, использование хеширования для шифрования/дешифрования параметров в URL-адресе и скрытых полях.

Я работаю над приложением Grails. Когда вы получаете запрос (например, чтобы показать один объект), идентификатор этого объекта будет отображаться в URL-адресе в браузере. Из соображений безопасности я пытаюсь зашифровать идентификатор в URL-адресе. любая идея, как я могу хэшировать идентификатор/или любые параметры в Grails.

http //url/controller/action/3
http //url/controller/action/08eab7690d2a6ee69

Мне интересно, есть ли что-то уже созданное, что позволило бы шифровать/расшифровывать параметры запроса в Grails.

Также возможно ли применить механизм шифрования/дешифрования в файле URLMapping, есть идеи?

заранее спасибо


person Hanan Atallah    schedule 20.04.2017    source источник


Ответы (1)


В принципе, вам не нужно создавать собственные методы шифрования/дешифрования. Могу я спросить, почему вы пытаетесь его зашифровать. Это потому, что у вас есть этот сценарий?

http://url/controller/id1
http://url/controller/id2

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

http://url/controller/id1?username=username
http://url/controller/id1?username=username2

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

Если вы все еще хотите зашифровать, дайте мне знать, и я могу дать вам дополнительные рекомендации.

def MyController {
  def index() {
     if (params.id) {
        params.id=Md5Helper.translate(params.id)
     }
  }
}

in src/groovy/main/{package}/Md5Helper.groovy

class Md5Helper.groovy {

   //return deconverted string into Long value
   public static Long translate(String input) {
     //do your md5 decryption here
      if (result.isNumber()) {
         return result as Long
      }
      return 0L
   }

   //override so when default Long is sent just return it
   public static Long translate(Long input) {
      return input
   }

}

CompileStatic вспомогательный класс, если выше grails 2.4 и выполненная работа

Отказ от шифрования md5 и использование надлежащего внутреннего шифрования/дешифрования с ключом, который вы можете изменить, сделав его нешифруемым конечным пользователем, см. https://github.com/vahidhedayati/md5id/

person V H    schedule 20.04.2017
comment
Спасибо за ваш ответ, на самом деле требование здесь из соображений безопасности состоит в том, чтобы не показывать сам идентификатор в URL-адресе, а зашифрованное значение url /controller/id1 ==›› url/controller/(зашифрованный id), поэтому пользователь не будет знать настоящий идентификатор, но вместо этого он увидит зашифрованный идентификатор - person Hanan Atallah; 20.04.2017
comment
насколько зашифрованы вам нужны вещи - есть базовое дешифруемое шифрование, я думаю, это была md5 строки, которую вы можете декомпилировать, но так же может пользователь - или есть полное шифрование, для которого требуется ключ для затем расшифровать - person V H; 20.04.2017
comment
md5 достаточно хорош, как я могу применить его в Grails (представление/контроллер)? - person Hanan Atallah; 20.04.2017
comment
tothenew.com /blog/ avajava.com/tutorials/lessons/ должен вам помочь Я уверен, что у меня есть гораздо более простой способ, я найду его и обновлю другим комментарием, если я найду его позже другим gist.github.com/ikarius/299062/ - person V H; 20.04.2017
comment
Большое спасибо! - person Hanan Atallah; 20.04.2017
comment
Мне интересно, можем ли мы применить шифрование/дешифрование md5 в файле URLMapping, есть идеи? - Я также обновил вопрос выше - person Hanan Atallah; 24.04.2017
comment
/08eab7690d2a6ee69 по-прежнему обрабатывается Grails как params.id, и тогда вы должны написать этот процесс деконверсии. Вам нужен вспомогательный класс, который статически обновляет идентификатор, чтобы вы обновили мой ответ. - person V H; 24.04.2017
comment
так что я должен использовать в каждом контроллере/действии во всем проекте? - person Hanan Atallah; 24.04.2017
comment
В зависимости от того, как вы написали свой код, вы можете ввести централизованный контроллер, который расширяется всеми другими контроллерами и выполняет эту работу, а в частном методе все равно означает, что вы должны его вызывать, и это довольно уродливый способ решить проблему. Я бы предложил использовать компоненты проверки и иметь главный/базовый класс проверки, который автоматически волшебным образом преобразует идентификатор обратно, и все действия вашего контроллера, а затем использовать компоненты проверки, которые затем расширяют класс базовой проверки, который делает это. В конечном итоге вы переделываете работу Grails с элементом params.id. - person V H; 24.04.2017
comment
Пример github.com/vahidhedayati/md5id: обновленный идентификатор автоматически привязывается - person V H; 26.04.2017
comment
Большое спасибо. Я применяю предложенное исправление в своем приложении. Я использовал закодированный идентификатор как переходный в домене и выполняю декодирование в контроллере, поэтому внутри представлений ничего не делается. - person Hanan Atallah; 01.05.2017
comment
круто, это, наверное, даже умнее, чем предложенный пример в проекте. Не уверены, использовали ли вы предложенный метод для шифрования/дешифрования в соответствии с примером md5id. Заметил, что все объекты с идентификатором 1 имеют одинаковое шифрование, необходимо пересмотреть, чтобы посмотреть this.getClass() или Class.simpleName. Если вы хотите, чтобы я попытался расширить пример сайта, я могу взглянуть сегодня позже. Также думайте об этом при преобразовании переходного идентификатора, не означает ли это, что вам нужно реплицировать его во всех объектах домена, если, возможно, стоит посмотреть на абстрактный класс что делает это один разэто то, что остальные продлевают, обновляет в 1 месте - person V H; 01.05.2017