2012-06-17 32 views
14

thể trùng lặp:
Is there any hash function in PL/SQL?Oracle có bất kỳ hàm băm tích hợp nào không?

Tôi có một cột với kiểu cơ sở dữ liệu NCLOB trong Oracle 11g. Tôi cần có giá trị băm cho nội dung của nó. Làm thế nào tôi có thể làm điều này bằng cách sử dụng bất kỳ chức năng Oracle tích hợp hoặc bên trong một PL/SQL SP trong Oracle?

+0

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. –

+0

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 –

Trả lời

38

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'.

+0

Trong một số cách, đây là câu trả lời tốt hơn câu trả lời được chấp nhận trong câu hỏi trùng lặp. Mã ví dụ và chi tiết, so với chỉ là một liên kết đến một hướng dẫn. –

+0

OTOH, và thực sự đáng giá -1, người ta thường không muốn sử dụng băm mật mã của muối + mật khẩu, không mã hóa, để lưu mật khẩu (Trừ khi bạn cần để có thể trích xuất mật khẩu, nhưng đáng sợ.) Xem http: // security.stackexchange.com/questions/8945/what-is-the-use-of-password-encryption –

+0

@ShannonSeverance Tôi e rằng tôi không thể tranh luận về vấn đề này một cách thông minh hơn là liên kết một bài viết với một người là chuyên gia; hãy chấp nhận lời xin lỗi của tôi. Nếu bạn có suy nghĩ về vấn đề tôi luôn mở để nghe những ý tưởng mới. Tôi làm việc ra giả định hiện tại rằng các thuật toán mã hóa chưa được giải mã và các thuật toán băm không bị bẻ khóa đều có thể đảo ngược. Hashes là một cách cho đến khi ai đó đảo ngược chúng không dài. Với ý nghĩ đó, hãy xem xét những gì khác biệt về chúng. http://krebsonsecurity.com/2012/06/how-companies-can-beef-up-password-security/ –

Các vấn đề liên quan