Oracle 12c Hash加密

时间:2016-02-17 06:59:47

标签: oracle

我想存储用户表密码的哈希数据。 所以我想知道UserPassword字段的数据类型。 如何将数据插入UserPassword列&从User表中验证用户。

override func layoutSubviews() 
{
 self.backgroundView.backgroundColor = [UIColor redColor];
}

2 个答案:

答案 0 :(得分:1)

要安全存储密码,必须满足以下几个条件:

  • 存储密码的哈希值而不是密码本身
  • 使用加密密码防止字典攻击
  • 使用慢速哈希函数来防止暴力攻击

请参阅Secure Salted Password Hashing

此外,我建议使用散列函数和可以在其他平台上实现的编码,因为有一天,您需要从Oracle迁移,或者您可能希望在应用程序服务器中散列密码(而不是在数据库中。)

经过验证的密码散列函数是PBKDF2。 Oracle甚至使用它来存储用户的密码。但是,没有直接的实施方案。

Mike Pargeter在PBKDF2 in Oracle中发布了PL / SQL实现:

CREATE OR REPLACE FUNCTION pbkdf2
( p_password   IN VARCHAR2
, p_salt       IN VARCHAR2
, p_count      IN INTEGER
, p_key_length IN INTEGER
)
  RETURN VARCHAR2
IS
  l_block_count INTEGER;
  l_last        RAW(32767);
  l_xorsum      RAW(32767);
  l_result      RAW(32767);
BEGIN
  l_block_count := ceil(p_key_length / 20);  -- 20 bytes for SHA1.

  FOR i IN 1..l_block_count
  LOOP
    l_last := utl_raw.concat(utl_raw.cast_to_raw(p_salt), utl_raw.cast_from_binary_integer(i, utl_raw.big_endian));

    l_xorsum := NULL;

    FOR j IN 1..p_count
    LOOP
      l_last := dbms_crypto.mac(l_last, dbms_crypto.hmac_sh1, utl_raw.cast_to_raw(p_password));

      IF l_xorsum IS NULL
      THEN
        l_xorsum := l_last;
      ELSE
        l_xorsum := utl_raw.bit_xor(l_xorsum, l_last);
      END IF;

    END LOOP;

    l_result := utl_raw.concat(l_result, l_xorsum);

  END LOOP;

  RETURN rawtohex(utl_raw.substr(l_result, 1, p_key_length));

END pbkdf2;
/

请注意,该函数将结果作为十六进制编码字符串返回。这就是你想要的,所以你可以根据需要迁移到另一个系统。

要生成salt,请使用加密随机函数并将其与密码哈希一起存储,以便进行密码验证:

rawtohex(DBMS_CRYPTO.RANDOMBYTES(32))

答案 1 :(得分:0)

存储密码字的一种方法是使用A one-way hash function

  

单向散列函数是一种散列函数   方向。可以很容易地从输入数据计算哈希值,但是   很难生成散列到特定值的数据。   因此,单向散列函数可以很好地确保数据   完整性

您可以raw datatype获取密码栏
使用DBMS_CRYPTO.Hashraw生成password值 使用UTL_RAW.COMPARE检查密码匹配。

<强>演示

CREATE TABLE UserTable(
    usertId NUMBER(10) PRIMARY KEY ,
    username NVARCHAR2(50) NOT NULL,
    password RAW(500) NOT NULL
);
/
--Create table, executed in 106 ms

INSERT INTO UserTable 
SELECT 1, 'John', DBMS_CRYPTO.hash(utl_raw.cast_to_raw('abcd123'), 3) 
FROM dual;
--Insert - 1 row(s), executed in 37 ms

SELECT 
    usertId, username
FROM UserTable
WHERE UTL_RAW.COMPARE(password, DBMS_CRYPTO.hash(utl_raw.cast_to_raw('abcd123'), 3)) = 0;
--USERTID   USERNAME
--1         John

SELECT 
    usertId, username
FROM UserTable
WHERE UTL_RAW.COMPARE(password, DBMS_CRYPTO.hash(utl_raw.cast_to_raw('ABCD123'), 3)) = 0;
--no row selected