如何在postgres中实现与django相同的密码?
我需要从django和我的自定义应用程序访问相同的BD 我喜欢在Postgress9上实现与django相同的功能 这是我的尝试:如何在postgres中实现与django相同的密码?,django,postgresql,authentication,pycrypto,postgresql-9.1,Django,Postgresql,Authentication,Pycrypto,Postgresql 9.1,我需要从django和我的自定义应用程序访问相同的BD 我喜欢在Postgress9上实现与django相同的功能 这是我的尝试: CREATE EXTENSION pgcrypto SCHEMA public; -- Genera una cadena aleatoria del tamaño especificado CREATE OR REPLACE FUNCTION random_string(length integer) RETURNS TEXT AS $$ DECLARE
CREATE EXTENSION pgcrypto
SCHEMA public;
-- Genera una cadena aleatoria del tamaño especificado
CREATE OR REPLACE FUNCTION random_string(length integer)
RETURNS TEXT
AS $$
DECLARE
chars text[] := '{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}';
result text := '';
i integer := 0;
BEGIN
IF length < 0 THEN
raise exception 'Given length cannot be less than 0';
END IF;
FOR i IN 1..length LOOP
result := result || chars[1+random()*(array_length(chars, 1)-1)];
END LOOP;
RETURN result;
END;
$$
LANGUAGE plpgsql;
-- Encripta con SHA1 una cadena y retorna el tipo de algoritmo + salt + hash
CREATE OR REPLACE FUNCTION encryp_text(_text text)
RETURNS TEXT
AS $$
DECLARE
hash text := '';
salt text := '';
BEGIN
salt := random_string(12);
hash := encode( digest(random_string(12) || _text, 'SHA1'), 'hex');
RETURN 'sha1$' || salt || '$' || hash;
END;
$$
LANGUAGE 'plpgsql';
-- Resetea el pwd del usuario
CREATE OR REPLACE FUNCTION create_user (_username text, _password text, name text, lastname text, email text, isadmin bool, isstaff bool)
RETURNS BOOLEAN
AS $$
BEGIN
IF isadmin THEN
isstaff := isadmin;
END IF;
INSERT INTO auth_user(
username,
first_name,
last_name,
email,
password,
is_staff,
is_active,
is_superuser)
VALUES (_username,
name,
lastname,
email,
encryp_text(_password),
isstaff,
true,
isadmin);
END;
$$
LANGUAGE 'plpgsql';
SELECT create_user('sample','123','sample','user','s@s.com',true,true)
它失败了。我需要做什么
更新:
相同密码:
Django:sha1$46uim9Staj7A$D472909885D27A21BC6E4896641E27CC6E4ED25B6
帖子:sha1$CP5CDALuPntn$d85f6aec18ae781c02cddbaa53e7c92e1b2c7ab1
更新:我忘了这个问题。已作为show on解决并升级到新的bcrypt方法。目前,我们无法真正评论您的代码本身。然而,对于重用登录,我的建议是简单地使用Django使用的相同例程,根据需要将它们移植到新的语言或框架。这意味着您在安全方面只有一个权限点 注意,您不能将SHA哈希密码(任何算法)与PostgreSQL本身一起使用,因为PostgreSQL将密码存储为与用户名加盐的md5哈希。除非您有权访问未删除的用户名,否则无法有效更改PostgreSQL用户帐户。不过,您可能可以编写一个函数,该函数可以从相同的输入更改PostgreSQL和Django密码,但您需要注意语句日志记录。还请注意,在PostgreSQL中,ALTER USER没有参数化,因此您最终不得不使用pl/pgsql并执行以下操作:
EXECUTE $e$ ALTER USER $e$ || quote_ident(in_username) || $e$ WITH PASSWORD $e$
|| quote_literal(in_password);
就目前而言,我们没有办法真正批评您的代码本身。然而,对于重用登录,我的建议是简单地使用Django使用的相同例程,根据需要将它们移植到新的语言或框架。这意味着您在安全方面只有一个权限点 注意,您不能将SHA哈希密码(任何算法)与PostgreSQL本身一起使用,因为PostgreSQL将密码存储为与用户名加盐的md5哈希。除非您有权访问未删除的用户名,否则无法有效更改PostgreSQL用户帐户。不过,您可能可以编写一个函数,该函数可以从相同的输入更改PostgreSQL和Django密码,但您需要注意语句日志记录。还请注意,在PostgreSQL中,ALTER USER没有参数化,因此您最终不得不使用pl/pgsql并执行以下操作:
EXECUTE $e$ ALTER USER $e$ || quote_ident(in_username) || $e$ WITH PASSWORD $e$
|| quote_literal(in_password);
根据要求,我将按要求解决这些问题
-- Genera una cadena aleatoria del tamaño especificado
CREATE OR REPLACE FUNCTION random_string(length INTEGER, OUT RETURNS TEXT)
AS $$
DECLARE
chars TEXT[] := '{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}';
result TEXT := '';
i INTEGER := 0;
BEGIN
IF length < 0 THEN
raise exception 'Given length cannot be less than 0';
END IF;
FOR i IN 1..length LOOP
result := result || chars[1+random()*(array_length(chars, 1)-1)];
END LOOP;
RETURNS = result;
END;
$$
LANGUAGE plpgsql;
-- Encripta con SHA1 una cadena y retorna el tipo de algoritmo + salt + hash
CREATE OR REPLACE FUNCTION encryp_TEXT(_TEXT TEXT, OUT RETURNS TEXT)
AS $$
DECLARE
hash TEXT := '';
salt TEXT := '';
BEGIN
salt := random_string(12);
hash := encode( libs.digest(salt || _TEXT, 'sha1'), 'hex');
RETURNS = 'sha1$' || salt || '$' || hash;
END;
$$
LANGUAGE 'plpgsql';
根据要求,我将按要求解决这些问题
-- Genera una cadena aleatoria del tamaño especificado
CREATE OR REPLACE FUNCTION random_string(length INTEGER, OUT RETURNS TEXT)
AS $$
DECLARE
chars TEXT[] := '{0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z}';
result TEXT := '';
i INTEGER := 0;
BEGIN
IF length < 0 THEN
raise exception 'Given length cannot be less than 0';
END IF;
FOR i IN 1..length LOOP
result := result || chars[1+random()*(array_length(chars, 1)-1)];
END LOOP;
RETURNS = result;
END;
$$
LANGUAGE plpgsql;
-- Encripta con SHA1 una cadena y retorna el tipo de algoritmo + salt + hash
CREATE OR REPLACE FUNCTION encryp_TEXT(_TEXT TEXT, OUT RETURNS TEXT)
AS $$
DECLARE
hash TEXT := '';
salt TEXT := '';
BEGIN
salt := random_string(12);
hash := encode( libs.digest(salt || _TEXT, 'sha1'), 'hex');
RETURNS = 'sha1$' || salt || '$' || hash;
END;
$$
LANGUAGE 'plpgsql';
如果您在manage.py shell中创建一个普通的django用户并设置其密码和保存,那么authenticate()对该帐户有效吗?您是否可以将psql的输出包括在('sample','sample''u from_django_shell')中的auth_user where username中,
select*的输出?
?如果您在用户表上创建一个before insert触发器,会不会更容易一些?。这样,每次插入新记录时,它都会加密密码。要做到这一点,您可以使用PGCryptograph中的crypt()和gen_salt()。您可以提供使用哈希的特定密码吗?大概是一次性的?你能回答一下吗?我很高兴向上投票。向上投票链接答案比在此处复制更有意义吗?如果您在manage.py shell中创建一个普通的django用户并设置其密码和保存,那么authenticate()对该帐户有效吗?您是否可以将psql的输出包括在('sample','sample''u from_django_shell')中的auth_user where username中,select*的输出?
?如果您在用户表上创建一个before insert触发器,会不会更容易一些?。这样,每次插入新记录时,它都会加密密码。要做到这一点,您可以使用PGCryptograph中的crypt()和gen_salt()。您可以提供使用哈希的特定密码吗?大概是一次性的?你能回答一下吗?我很高兴向上投票。向链接答案上投票比在这里复制更有意义吗?