Съхраняване на хеш като байтов масив с JPA

Моят клас обект User съдържа поле за хеш на паролата, което е масив от байтове с фиксирана дължина (32, тъй като е хеш на SHA-256).

@Entity
public class User {
    @Column(nullable=false)
    private byte[] passwordHash;
    ...
}

Както можете да видите, не съм го анотирал с нищо специално, само с NOT NULL.

Това работи, но ще се справи ли? Моята схема се генерира от Hibernate, но не знам какво точно генерира (в момента използвам HSQL база данни в паметта).

Притеснявам се, че тъй като не знае, че това е масив с фиксирана дължина (полето length на анотацията Column се отнася само за низове), той ще съхрани този хеш в BLOB поле, което се добавя в записа като указател (ако разбирам правилно как работят базите данни).

Вярно ли е това и как мога да променя това? Трябва ли просто да кодирам хеша като низ, с base64 или шестнадесетичен, приемайки малкото въздействие върху производителността/коректността от това?


person Bart van Heukelom    schedule 29.09.2010    source източник
comment
Защо не опитате с действителната целева база данни и не видите какво генерира?   -  person skaffman    schedule 29.09.2010
comment
@skaffman: Промених базата данни на MySQL и тя генерира колона TINYBLOB   -  person Bart van Heukelom    schedule 29.09.2010
comment
Въпреки че предполагам, че наистина няма значение. Никога няма да индексирам по хеш парола и ще трябва да го чета само за един запис наведнъж. Все още се интересувам да го направя перфектен за академични цели.   -  person Bart van Heukelom    schedule 01.10.2010


Отговори (4)


Притеснявам се, че тъй като не знае, че е масив с фиксирана дължина (полето за дължина на анотацията за колона се отнася само за низове), (...)

Ако посочите дължината на колоната, Hibernate ще използва тази информация, за да определи типа SQL колона за генериране (TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB).

Това, от което се нуждая, е BINARY (32)

Опитахте ли това?

@Column(columnDefinition="BINARY(32) NOT NULL")
private byte[] passwordHash;
person Pascal Thivent    schedule 09.10.2010

tinyblob е добра радост (референция за типовете mysql), но всичките ми приложения работят добре с низове . Ако наистина ви е грижа за милисекундите, опитайте и двете версии в профайлър и вижте кое работи най-добре. Предпочитаният от мен профайлър е този, включен в netbeans.

person klause    schedule 01.10.2010

Доколкото знам, хешът на SHA-256 винаги е само отпечатваеми знаци (и ако не, кодирайте го base64), така че решението е, че МОЖЕТЕ да го съхранявате като низ, след което да използвате полето length на анотацията Column.

Тогава имате вашата фиксирана дължина и няма съмнение относно ефективността.

person lImbus    schedule 08.10.2010
comment
Не, видях изхода и той наистина се състои предимно от непечатаеми знаци (или по-скоро изобщо не са данни за знаци). Разбира се, бих могъл да го кодирам base64 или шестнадесетичен, но ако мога да го съхраня в чиста двоична форма, това би било хубаво. - person Bart van Heukelom; 11.10.2010

Може да не е толкова ефективно, но предлагам да използвате String като тип съхранение и да превеждате, ако е необходимо, с методите getter и setter. Това позволява максимална преносимост на JPA между различни бази данни.

Използвам подобна техника с Дата/Час, като съхранявам longs, които представляват време от епоха в UTC, което ми позволява да избегна проблеми с часовата зона (информацията за часовата зона не е преносима в датите на базата данни във всички бази данни).

person Archimedes Trajano    schedule 19.03.2012