数据库中怎样存储用户密码才能保证安全

数据库中怎样存储用户密码才能保证安全,第1张

正确的方法就是不存储密码,而是存储对密码进行不可逆加密(如MD5)后的结果。这样别人打开数据库也只能看到加密运算后的结果,无法反推出密码。而需要验证用户密码时,只需要同样进行加密运算然后和数据库里的结果对比是否一致即可。

一般是先加盐再用不可逆加密算法加密密码的,常见的有:sha1 sha256 md5等。

作用:这些加密算法,只能加密,不能逆向解密,所以使用这些算法。即时你的数据库被拖库,得到的人,也无法知道用户密码。

为什么加盐

举例

在注册时,

假设你的密码是1234,一般服务器会加一个盐(随便一个乱打的字符串),和你的密码加在一起,1234和efnU(@#H!JKNF得到1234efnU(@#H!JKNF这个值,然后再进行加密(这里我用md5)得到 91dc02c1fc2ce2252969e6b86173aa78,于是数据库里你的密码就变为了91dc02c1fc2ce2252969e6b86173aa78

登入时,

你输入1234, 然后服务器用和注册相同的步骤进行加密,得到加密后的值,91dc02c1fc2ce2252969e6b86173aa78,将这个值与数据库的加密值比对,如果正确则登入。

题主你可以使用 md5 或者 sha1 进行初步处理,但为了更加安全,请你同时加上两个 salt,一个静态 salt,一个动态的 salt。以 md5 为例:

假设通过 POST 传来的密码为 $_POST['password'],在存入 DB 前先进行如下的 *** 作:

$password = hash('md5', $_POST['password']$staticSalt$dynamicSalt);

为了保证动态 salt 的唯一性,可以这样 *** 作:

$dynamicSalt = hash('md5', microtime());

对于动态的 salt 可以与生成的密码一起保存在 DB 中,而静态 salt 则可以直接放在类文件中(例如定义为一个静态属性即可)。

首先谢谢题主采纳了我的答案,但是我之前的回答并不是最佳答案,之所以有此加密的想法源于自己所读的源码可能比较老,所以并没使用上较新版本的加密方法,例如 bcrypt等。

此外,第二点,感谢评论中几位前辈的提点,已经明白设置静态 salt 的意义并不大,生成一个较长的动态 salt 已然可以解决问题。

LZ应该采用加盐HASH。

如何“腌制”密码呢?

=_,=

正确的格式应该是,用户password+动态的salt

动态的salt不能像2L所说的,使用microtime,因为时间在某些情况下不够随机,而且是可能被猜解的。

这里推荐一个我用的加盐HASH

$salt=base64_encode(mcrypt_create_iv(32,MCRYPT_DEV_RANDOM));

$password=sha1($register_password$salt);

解释:

首先使用mcrypt,产生电脑随机生成的,专门用户加密的随机数函数。

第二步,把得到的随机数通过base64加密,使其变长并且不利于猜解。

第三步,把得出的盐拼接到密码的后面,再对其使用sha1进行哈希

再把password存入到用户的数据库。

PS:为何不用静态的salt?没有必要,使用一个动态随机足够长的盐足矣。

为何不用MD5?因为长度不够。

为何没有使用多次HASH?因为这样反而容易发生碰撞。

HASH好之后怎么使用“腌制”好的密码?

用户注册->提交密码->产生salt->腌制好的密码存入数据库->salt存入数据库。

用户登录->提交密码->调用salt接到提交密码的后面->进行HASH->调用之前注册腌制好的密码->对比HASH值是否和这个密码相同

可以例用Oracle

自带的Wrap工具实现,此工具在$ORACLE_HOME/BIN目录下,具体如下

1、设置字符集环境变量

set

NLS_LANG=CHINESE_CHINAZHS16GBK

2、创建一个存储过程文件

在E:\下创建testsql文件,内容如下:

create

or

replace

procedure

test1(i

in

number)

as

begin

dbms_outputput_line('

输入参数是'||to_char(i));

end;

3、加密

c:\>

cd

%ORACLE_HOME%\BIN

c:\>wrap

iname=e:\test1sql

PL/SQL

Wrapper:

Release

81700

-

Production

on

Tue

Nov

27

22:26:48

2001

Copyright

(c)

Oracle

Corporation

1993,

2000All

Rights

Reserved

Processing

test1sql

to

test1plb

4、运行test1plb

sqlplus

/nolog

SQL>conn

TEST/TEST@db01

SQL>

@e:\aplb

过程已创建。

5、运行存储过程

SQL>

set

serveroutput

on

SQL>

execute

test1(1);

输入参数是1

PL/SQL

过程已成功完成。

6、查看存储过程的代码

SQL>

select

name,text

from

all_source

where

type='PROCEDURE'

and

name='TEST1';

结果:看不到其原码

以上就是关于数据库中怎样存储用户密码才能保证安全全部的内容,包括:数据库中怎样存储用户密码才能保证安全、数据库里加密的密码是怎么实现的、各位用php将密码存入数据库,都用什么方法进行加密的等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/10083369.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存