7

我有一个 mySQL 数据库,我正在使用 phpMyAdmin 来访问它。该数据库有表员工,其中包含姓名、地址、电子邮件和密码等字段。

最初密码字段只是VARCHAR (20). 但现在我想用 SHA-256 散列技术对我的密码进行散列。

我对数据库没有太多经验,所以我想知道的是-

  1. 我可以在不影响其他字段或整个表的情况下散列所有当前员工的密码吗?

  2. 将来当我(从 Web 应用程序)在数据库中输入数据时,我在哪里编写散列函数来散列密码?即散列是否发生在前端,然后散列密码存储在数据库中,或者密码进入数据库进行散列然后存储。

解决方案和建议表示赞赏。

4

3 回答 3

10

Q1:我可以在不影响其他字段或整个表的情况下散列所有当前员工的密码吗?

答:是的。但是您需要将密码列的大小更改为 40-42。您将使用PASSWORD( )内置函数来加密您的密码

ALTER TABLE tableName MODIFY `password` VARCHAR(42); 

之后,您现在可以更新密码列

UPDATE tablename
SET     `password` = PASSWORD(`password`);

前任。)

abcde12345 => *20B30AFAF441808B50273EDA287132EC25B02DE2

Q2:将来当我在数据库中输入数据时(从网络应用程序),我在哪里编写散列函数来散列密码?

答:在你的INSERT query

INSERT INTO tableName (name, address, email, password) 
VALUES ('aa','bb',''cc,PASSWORD('abcde12345'))

当您要搜索密码时,请先加密文本:

SELECT *
FROM   tableName
WHERE `password` = PASSWORD('abcde12345')

还有一件事,不要忘记将您的Password列转义,backtick因为它是MySQL 保留字。

于 2012-08-08T10:05:16.333 回答
1

您可以在 php 中对密码进行哈希处理,然后将其存储在数据库中:

$pwd = hash('sha256',$_POST['password']);

MySQL 不支持 sha256 功能,因此您需要通过代码散列,然后存储/更新您的密码表。否则你可以考虑这个http://stuge.se/mysql-sha256/

于 2012-08-08T09:21:00.950 回答
0

我可以在不影响其他字段或整个表的情况下散列所有当前员工的密码吗?

是的。例如,如果您要使用SHA-1哈希函数,您可以添加相应的列并通过一次查询对所有密码进行哈希处理:

alter table employee add column password_hash varchar(40);
update employee set password_hash = sha1(password);

假设您的纯文本密码列称为“密码”。当然,您可以在获得散列后删除原始列(并且很可能这正是您接下来想要做的)。

但是,我强烈建议您阅读更多有关散列算法的内容并选择更好的内容。例如,您可能想要使用不同的散列函数和/或添加salt

将来当我(从 Web 应用程序)在数据库中输入数据时,我在哪里编写散列函数来散列密码?即散列是否发生在前端,然后散列密码存储在数据库中,或者密码进入数据库进行散列然后存储。

最常见的是,每次用户登录时都会在服务器端进行哈希处理。然后创建身份验证会话并将会话 ID 存储在用户的 cookie 中(因此,您永远不会将密码或其哈希值存储在客户端,但是,您在用户登录时将其传输到服务器,这就是为什么至少使用 SSL 进行身份验证的原因)。

在某些情况下,您甚至可能想要构建一个单独的身份验证后端,它只接受密码哈希请求(因此,即使有人破解了您的系统,确切的哈希模式仍然是秘密的,直到他们也破解了哈希后端,这可以是如果构建得足够仔细,难度会大得多)。但是,您只需要这样的东西,以防您真的非常关心安全性并且它非常重要。否则,典型的服务器端散列就足够了。

于 2012-08-08T09:25:40.093 回答