Có:băm và mã hóa (có liên quan nhưng không hoàn toàn giống nhau) đều được thực hiện thông qua gói SYS DBMS_CRYPTO.
Băm SHA-1 đơn giản
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_SH1 );
Băm MD5 đơn giản
l_hash := dbms_crypto.hash( l_src, dbms_crypto.HASH_MD5 );
Tổng quan về dbms_crypto.hash ()
Hàm hash () được nạp chồng để chấp nhận các kiểu sau:RAW, BLOB và CLOB. Theo chuyển đổi dữ liệu đơn giản đối với các loại đầu vào thô được chấp nhận là RAW, CHAR, VARCHAR2, NCHAR, NVARCHAR2, LONG, BLOB. Tất cả các loại dữ liệu khác (DATE, TIMESTAMP, v.v.) không được đề cập trong chuyển đổi RAW / RAW ngầm định, BLOB và CLOB sẽ phải được chuyển qua TO_CHAR () trước tiên.
Cần lưu ý rằng dbms_crypto.hash () hỗ trợ các thuật toán băm sau:
- HASH_MD4
- HASH_MD5
- HASH_SH1
Mật khẩu:Chỉ trong trường hợp
Nếu bạn đang lưu trữ mật khẩu, tôi khuyên bạn nên sử dụng băm lưu trữ mật khẩu (bcrypt, PBKDF2 hoặc scrypt) thay vì băm mật mã (md5, sha-1, v.v.). Sự khác biệt là các hàm băm lưu trữ mật khẩu có nghĩa là mất thời gian để phá vỡ trong khi các hàm băm mật mã được thực hiện nhanh chóng. Khi tấn công danh sách mật khẩu của hệ thống thông qua brute force, nó sẽ đòi hỏi nhiều thời gian hơn khi cố gắng phá vỡ một giá trị mặn được chuyển qua một thuật toán mật mã. Hãy xem xét rằng việc sử dụng băm mật khẩu trên một giá trị có thể mất ~ 100ms (không nhiều đối với một lần đăng nhập xác thực), nhưng rất chậm đối với một lực lượng thô bạo (hàng triệu / tỷ lần thử cho mỗi mật khẩu) trên toàn bộ danh sách mật khẩu của bạn.
Oracle ghét mật khẩu băm
Đối với giá trị của nó, tôi không biết bất kỳ gói nào từ Oracle cung cấp hỗ trợ băm mật khẩu. Tuy nhiên, bạn có thể thực hiện điều này bằng cách sử dụng ' loadjava 'và đặt một triển khai bcrypt Java trong JVM chạy trong đó RDBMS của Oracle. Sau đó, bạn có thể sử dụng PL / SQL wrapper để gọi lớp Java của bạn có triển khai bcrypt. Nếu bạn đang sử dụng bậc trung gian, bạn có thể sử dụng nhiều tùy chọn khác có sẵn cho bạn bằng ngôn ngữ đó (.NET, PHP, Perl, Ruby, Python, Java, v.v.) và bỏ qua việc cố gắng sử dụng 'loadjava'.
Ý tôi là mã hóa không phải mã băm!
Trong trường hợp băm bạn cần không được dbms_crypto.hash () bao gồm, bạn có thể đang tìm kiếm mã hóa qua dbms_crypto.encrypt, cách này hoạt động rất tương tự ngoại trừ nó có các loại sau:
- ENCRYPT_DES
- ENCRYPT_3DES_2KEY
- ENCRYPT_3DES
- ENCRYPT_AES
- ENCRYPT_PBE_MD5DES
- ENCRYPT_AES128
- ENCRYPT_AES192
- ENCRYPT_AES256
Đây là toàn bộ tài liệu 11gR2 về DBMS_CRYPTO . Tất cả các phiên bản khác có sẵn trên tahiti.oracle.com . Chỉ cần nhấp vào phiên bản của bạn và sau đó tìm kiếm 'dbms_crypto'.