Mysql
 sql >> база данни >  >> RDS >> Mysql

Хибернация на криптиране на база данни Напълно прозрачно за приложение

Ако приключите с работата в приложението, можете да използвате персонализирани типове на Hibernate и това няма да добави толкова много промени към кода ви.

Ето персонализиран тип криптиран низ, който използвах:

import org.hibernate.usertype.UserType
import org.apache.log4j.Logger

import java.sql.PreparedStatement
import java.sql.ResultSet
import java.sql.SQLException
import java.sql.Types

class EncryptedString implements UserType {

  // prefix category name with 'org.hibernate.type' to make logging of all types easier
  private final Logger _log = Logger.getLogger('org.hibernate.type.com.yourcompany.EncryptedString')

  Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws SQLException {
    String value = rs.getString(names[0])

    if (!value) {
      _log.trace "returning null as column: $names[0]"
      return null
    }

    _log.trace "returning '$value' as column: $names[0]"
    return CryptoUtils.decrypt(value)
  }

  void nullSafeSet(PreparedStatement st, Object value, int index) throws SQLException {
    if (value) {
      String encrypted = CryptoUtils.encrypt(value.toString())
      _log.trace "binding '$encrypted' to parameter: $index"
      st.setString index, encrypted
    }
    else {
      _log.trace "binding null to parameter: $index"
      st.setNull(index, Types.VARCHAR)
    }
  }

  Class<String> returnedClass() { String }

  int[] sqlTypes() { [Types.VARCHAR] as int[] }

  Object assemble(Serializable cached, Object owner) { cached.toString() }

  Object deepCopy(Object value) { value.toString() }

  Serializable disassemble(Object value) { value.toString() }

  boolean equals(Object x, Object y) { x == y }

  int hashCode(Object x) { x.hashCode() }

  boolean isMutable() { true }

  Object replace(Object original, Object target, Object owner) { original }
}

и въз основа на това трябва да е лесно да създавате подобни класове за int, long и т.н. За да го използвате, добавете типа към затварянето на картографиране:

class MyDomainClass {

  String name
  String otherField

  static mapping = {
    name type: EncryptedString
    otherField type: EncryptedString
  }
}

Пропуснах методите CryptoUtils.encrypt() и CryptoUtils.decrypt(), тъй като това не е специфично за Grails. Ние използваме AES, напр. "Шифър =Cipher.getInstance('AES/CBC/PKCS5Padding')". Каквото и да използвате в крайна сметка, уверете се, че е двупосочна крипто, т.е. не използвайте SHA-256.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. C# MySQL втори DataReader в DataReader while цикъл

  2. PHP - свързване към mysql база данни от различен сървър

  3. php/mysql активиране на акаунт

  4. Име на MySQL таблица като параметър

  5. Създаването на ActiveRecord / Rails да използва действителни колони TIMESTAMP на mysql