Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Mã hóa ngủ đông của cơ sở dữ liệu hoàn toàn minh bạch với ứng dụng

Nếu bạn kết thúc công việc trong ứng dụng, bạn có thể sử dụng các loại tùy chỉnh Hibernate và nó sẽ không thêm nhiều thay đổi vào mã của bạn.

Đây là loại tùy chỉnh chuỗi được mã hóa mà tôi đã sử dụng:

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

và dựa trên điều này, thật đơn giản để tạo các lớp tương tự cho int, long, v.v. Để sử dụng nó, hãy thêm kiểu vào đóng ánh xạ:

class MyDomainClass {

  String name
  String otherField

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

Tôi đã bỏ qua các phương thức CryptoUtils.encrypt () và CryptoUtils.decrypt () vì nó không dành riêng cho Grails. Chúng tôi đang sử dụng AES, ví dụ:"Cipher cipher =Cipher.getInstance ('AES / CBC / PKCS5Padding')". Dù cuối cùng bạn đang sử dụng gì, hãy đảm bảo rằng đó là tiền điện tử 2 chiều, tức là không sử dụng 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ách tìm nạp trường từ kết quả truy vấn MySQL trong bash

  2. lỗi mysql node.js:ECONNREFUSED

  3. Lược đồ cơ sở dữ liệu hệ thống nhắn tin

  4. Nhận Giá trị CŨ trong MySQL Trigger SAU KHI Cập nhật Tuyên bố

  5. Trường số nguyên MySQL được trả về dưới dạng chuỗi trong PHP