如何在postgres中实现与django相同的密码码



我需要从django和我的自定义应用程序访问相同的BD。

我想在postgres9上实现与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
  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中,当尝试验证时:

from django.contrib.auth import authenticate
authenticate(username='sample', password='123')

它失败。我需要做什么?

更新:

相同的密码:

Django: sha1 46 uim9staj7a d472909885d27a21bc6e489641e27cc6e4ed25b6美元postgres: sha1 CP5CDALuPntn d85f6aec18ae781c02cddbaa53e7c92e1b2c7ab1美元

更新:我忘了这个问题。

如何在postgres 9.1中重新实现BCryptPasswordHasher并升级到新的bcrypt方法。

就目前情况而言,我们没有办法真正对您的代码本身进行评论。然而,要重用登录,我的建议是简单地使用Django使用的相同例程,必要时将它们移植到新的语言或框架中。这意味着您在安全性方面有一个单一的权限点。

注意,PostgreSQL本身不能使用SHA哈希密码(任何算法),因为PostgreSQL将密码存储为与用户名一起添加的md5哈希。除非你有权访问未散列的用户名,否则你不能有效地修改PostgreSQL的用户名。然而,你可能能够编写一个函数,从相同的输入修改PostgreSQL和Django的密码,但你需要小心语句日志。还要注意,ALTER USER在PostgreSQL中没有参数化,所以你最终不得不使用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';

然而,这在新的django(1.5)中不再是正确的。正确的版本是如何重新实现BCryptPasswordHasher的django与postgres 9.1

现在

:

-- Encripta con bcrypto una cadena y retorna el tipo de algoritmo + salt + hash, django compatible
CREATE OR REPLACE FUNCTION encryp_text(_TEXT TEXT, OUT RETURNS TEXT)
AS $$
DECLARE
    hash TEXT := '';
    salt TEXT := '';
BEGIN
    salt := random_string(12);
    hash := libs.crypt(_TEXT,salt);
    RETURNS =  'bcrypt$' || hash;
END;
$$
LANGUAGE 'plpgsql';

相关内容

  • 没有找到相关文章

最新更新