Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Enkripsi Hibernasi Basis Data Sepenuhnya Transparan untuk Aplikasi

Jika Anda selesai melakukan pekerjaan di aplikasi, Anda dapat menggunakan tipe kustom Hibernate dan itu tidak akan menambahkan banyak perubahan pada kode Anda.

Berikut adalah jenis kustom string terenkripsi yang telah saya gunakan:

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

dan berdasarkan ini seharusnya mudah untuk membuat kelas serupa untuk int, long, dll. Untuk menggunakannya, tambahkan tipe ke penutupan pemetaan:

class MyDomainClass {

  String name
  String otherField

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

Saya menghilangkan metode CryptoUtils.encrypt() dan CryptoUtils.decrypt() karena itu bukan khusus Grails. Kami menggunakan AES, mis. "Cipher cipher =Cipher.getInstance('AES/CBC/PKCS5Padding')". Apa pun yang akhirnya Anda gunakan, pastikan itu adalah kripto 2 arah, yaitu jangan gunakan 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. Cara mengatur max_connections di MySQL Secara Terprogram

  2. Mengubah IP menjadi Long di MySQL

  3. Django + MySQL pada Mac OS 10.6.2 Snow Leopard

  4. MySQL CURRENT_TIMESTAMP saat membuat dan memperbarui

  5. MySQL JOIN Penyalahgunaan? Seberapa buruk itu bisa terjadi?