хранение SHA-1 хэшей с EclipseLink & PostgreSQL - PullRequest
1 голос
/ 24 ноября 2010

Я использую eclipselink в качестве реализации JPA и PostgreSQL и хочу хранить хэши SHA-1 в базе данных. Но я получаю исключение, подобное этому:

Внутреннее исключение: org.postgresql.util.PSQLException: ОШИБКА: неверная последовательность байтов для кодировки "UTF8": 0x00 Код ошибки: 0 Звоните: INSERT INTO mbm_user (ИМЯ ПОЛЬЗОВАТЕЛЯ, ИМЯ, ЛАСТНИКА, ПАРОЛЬ) ЗНАЧЕНИЯ (?,?,?,?) bind => [Ганс, ноль, ноль, хэш SHA-1]

SHA-1 HASH - это несколько бессмысленных символов, и я не могу их здесь вставить.

Моя сущность:

@Entity
@Table(name="mbm_user")
public class User extends CanAccessBook{

  @Id @GeneratedValue(strategy=GenerationType.IDENTITY)
  @Column(nullable = false)
  private Long id;

  @Column(nullable = false)
  private String username;

   @Column(nullable = false)
   private String password;

   private String prename;

   private String lastname;
       ...
       ...
}

И метод генерации хэша SHA-1:

    public void setPassword(String password) {
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-1");
        byte[] encryptPassword = md.digest(password.getBytes());
        this.password = new String(encryptPassword);
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
}

Как я могу избежать использования нелегального char 0x00 или проблема в другом месте?

1 Ответ

2 голосов
/ 24 ноября 2010

Вы пытаетесь втиснуть байт [] в строку, которая никогда не будет работать хорошо.

  1. Сохраните хэш SHA-1 в виде BLOB-объекта.Вверху головы:
    @Lob
    @Column(nullable = false)
    private byte[] passwordHash;
  1. Кодируйте двоичные данные в текстовое представление, в виде шестнадцатеричной строки или что-то вроде Base64.Google для двоичногоToHexString или base64encoder, который должен поставить вас на правильный путь.
...