Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Hibernacyjne szyfrowanie bazy danych całkowicie przejrzyste dla aplikacji

Jeśli zakończysz pracę w aplikacji, możesz użyć niestandardowych typów Hibernate i nie spowoduje to dodania wielu zmian do kodu.

Oto niestandardowy typ zaszyfrowanego ciągu, którego użyłem:

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

i na tej podstawie powinno być proste tworzenie podobnych klas dla int, long itp. Aby tego użyć, dodaj typ do zamknięcia mapowania:

class MyDomainClass {

  String name
  String otherField

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

Pominąłem metody CryptoUtils.encrypt() i CryptoUtils.decrypt(), ponieważ nie są one specyficzne dla Grails. Używamy AES m.in. "Szyfr Szyfru =Cipher.getInstance('AES/CBC/PKCS5Padding')". Czegokolwiek używasz, upewnij się, że jest to krypto dwukierunkowe, tj. nie używaj 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. Jak uruchomić funkcję mysqli connect?

  2. Jak monitorować bazy danych MySQL/MariaDB za pomocą Netdata w CentOS 7?

  3. PHP i MYSQL:używanie grupowania według kategorii

  4. nie można uzyskać dostępu do mysql z wiersza poleceń mac

  5. Jak ponownie zaktualizować kolumnę id, zaczynając od 1?