我想存储用户表密码的哈希数据。 所以我想知道UserPassword字段的数据类型。 如何将数据插入UserPassword列&从User表中验证用户。
override func layoutSubviews()
{
self.backgroundView.backgroundColor = [UIColor redColor];
}
答案 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.Hash
从raw
生成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