Có: băm và mã hóa (có liên quan nhưng không chính xác giống nhau) đều được thực hiện thông qua gói SYS DBMS_CRYPTO.
Simple SHA-1 Băm
l_hash := dbms_crypto.hash(l_src, dbms_crypto.HASH_SH1);
Simple MD5 băm
l_hash := dbms_crypto.hash(l_src, dbms_crypto.HASH_MD5);
Tổng quan về dbms_crypto.hash()
Các băm() chức năng bị quá tải để chấp nhận các loại sau: RAW, BLOB, a nd CLOB. Theo số implicity data conversions cho các loại đầu vào có thể chấp nhận được 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 bao gồm trong chuyển đổi RAW RAW/ngầm, BLOB và CLOB sẽ phải được chuyển qua TO_CHAR() trước tiên.
Điều đáng chú ý là dbms_crypto.hash() hỗ trợ các thuật toán băm sau:
- HASH_MD4
- HASH_MD5
- HASH_SH1
Passwords: 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 mật khẩu lưu trữ (bcrypt, PBKDF2 hoặc scrypt) thay vì băm mật mã (md5, sha-1, v.v.). Sự khác biệt là lưu trữ mật khẩu băm có nghĩa là phải mất thời gian để phá vỡ trong khi băm mật mã có nghĩa là phải được thực hiện một cách nhanh chóng. Khi tấn công danh sách mật khẩu của hệ thống thông qua lực lượng vũ phu, các đơn đặt hàng của cường độ tốn nhiều thời gian hơn khi cố gắng phá vỡ một giá trị muối được truyền qua một thuật toán mã hóa. Hãy xem xét 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 cho một lần đăng nhập xác thực), nhưng rất chậm cho một lực lượng bạo lực (hàng triệu/hàng tỷ lần thử trên mỗi mật khẩu) trong 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 những gì giá trị của nó tôi không biết về bất kỳ gói từ Oracle cung cấp hỗ trợ mật khẩu băm. 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 với RDBMS của Oracle. Sau đó, bạn có thể sử dụng một số PL/SQL wrapper để gọi lớp Java của bạn triển khai bcrypt. Nếu bạn đang sử dụng tầng giữa, 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 cố gắng sử dụng 'loadjava'.
Tôi có nghĩa là mã hóa không phải là băm!
Trong trường hợp băm bạn cần không được bao phủ bởi dbms_crypto.hash(), bạn có thể tìm kiếm mã hóa qua dbms_crypto.encrypt mà hoạt động rất tương tự ngoại trừ việc nó mất trong các loại sau đây:
- ENCRYPT_DES
- ENCRYPT_3DES_2KEY
- ENCRYPT_3DES
- ENCRYPT_AES
- ENCRYPT_PBE_MD5DES
- ENCRYPT_AES128
- ENCRYPT_AES192
- ENCRYPT_AES256
Dưới đây là toàn bộ 11gR2 documentation on DBMS_CRYPTO. Tất cả các phiên bản khác có sẵn qua 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'.
Xem dbms_crypto.hash http://docs.oracle.com/cd/E11882_01/appdev.112/e25788/d_crypto.htm#ARPLS65700. Tôi không thấy một phiên bản mà có NCLOB, tôi không biết làm thế nào nếu 'src TRONG CLOB CHARACTER SET ANY_CS' có thể mất một NCLOB mà không mất trong mọi trường hợp. Một cái gì đó để điều tra. –
Câu hỏi này không phải là * chính xác * trùng lặp. Có một số khác biệt tinh tế nhưng quan trọng giữa việc băm một NCLOB hoặc VARCHAR2. Cụ thể, việc băm nhỏ NCLOB có thể không xác định nếu bạn sử dụng ORA_HASH, vì vậy một trong những câu trả lời cho câu hỏi khác có thể không phù hợp. Xem câu trả lời của tôi ở đây để biết thông tin về băm xác định: http://stackoverflow.com/a/9476696/409172 –