我有一个mySQL数据库,我正在使用phpMyAdmin来访问它。数据库具有表员工,其中包含姓名,地址,电子邮件和密码等字段。
最初,密码字段只是VARCHAR (20)
。但现在我想用SHA-256哈希技术哈希我的密码。
我对数据库没有太多经验,所以我想知道的是 -
我可以在不影响其他字段或整个表的情况下哈希所有当前员工的密码吗?
将来当我在数据库中输入数据时(来自Web应用程序),我在哪里编写散列函数来散列密码?即散列是否发生在前端,然后散列的密码存储在数据库中,或者密码进入数据库进行散列然后存储。
解决方案和建议表示赞赏。
答案 0 :(得分:10)
Q1:我可以在不影响其他字段或整个表格的情况下散列所有当前员工的密码吗?
A:是的。但是您需要将密码列的大小改为40-42。您将使用PASSWORD( )
内置函数来加密密码
ALTER TABLE tableName MODIFY `password` VARCHAR(42);
之后,您现在可以更新密码列
UPDATE tablename
SET `password` = PASSWORD(`password`);
例)
abcde12345 => *20B30AFAF441808B50273EDA287132EC25B02DE2
Q2:将来当我在数据库中输入数据时(来自Web应用程序),我在哪里编写散列函数来散列密码?
A:在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 Reserved Word.
答案 1 :(得分:1)
您可以在php中散列密码,然后将其存储在DB中:
$pwd = hash('sha256',$_POST['password']);
MySQL不支持sha256功能,因此您需要按代码进行哈希,然后存储/更新密码表。否则你可以考虑这个http://stuge.se/mysql-sha256/
答案 2 :(得分:0)
我可以哈希所有当前员工的密码而不影响 其他领域还是整个表?
是。例如,如果您要使用SHA-1散列函数,则可以添加相应的列并使用一个查询散列所有密码:
alter table employee add column password_hash varchar(40);
update employee set password_hash = sha1(password);
假设您的纯文本密码列称为“密码”。当然,你可以在拥有哈希值之后删除原始列(并且,很可能,这正是你想要做的事情)。
但是,我强烈建议您在hashing algorithms上阅读更多内容并选择更好的内容。例如,您可能希望使用其他散列函数和/或添加salt。
将来我在数据库中输入数据(来自网络) 应用程序),我在哪里写散列函数来散列 密码?即,是否在前端发生散列,然后发生散射 哈希密码存储在数据库中,或密码存入数据库 它被散列然后存储。
最常见的是,每次用户登录时都会在服务器端进行散列。然后创建身份验证会话,并将会话ID存储在用户的cookie中(因此您永远不会在客户端存储密码或哈希值)但是,当用户登录时,您将其传输到服务器,这就是为什么最好使用SSL进行身份验证的原因。)
在某些情况下,您甚至可能希望构建一个单独的身份验证后端,它只接受密码哈希请求(因此,即使有人闯入您的系统,确切的哈希模式在他们破解哈希后端之前仍然是秘密的,如果它足够仔细地构建,那可能会困难得多)。但是,如果您真的非常关心安全性,那么您只需要这样的东西,这非常重要。否则典型的服务器端散列就足够了。