随着我继续构建越来越多的网站和Web应用程序,我经常被要求以一种方式存储用户的密码,如果/当用户遇到问题时可以检索它们(要么通过电子邮件发送忘记的密码链接,请通过当我能够对抗这种做法时,我会做很多"额外"编程,以便在不存储实际密码的情况下进行密码重置和管理协助.
当我无法抗争(或无法获胜)时,我总是以某种方式对密码进行编码,以至于它至少不会以明文形式存储在数据库中 - 尽管我知道如果我的数据库被黑客攻击破坏密码的罪魁祸首并不需要太多,所以这让我感到不舒服.
在一个完美的世界里,人们经常更新密码,而不是在许多不同的网站上复制密码 - 不幸的是,我知道许多人拥有相同的工作/家庭/电子邮件/银行密码,甚至在需要帮助时自由地给我.如果我的数据库安全程序由于某种原因失败,我不想成为他们的财务终结负责人.
在道德和道德上,我觉得有责任保护一些用户的生活,即使他们以较少的尊重对待他们.我确信有许多途径可以用来腌制哈希和不同的编码选项,但是当你必须存储它们时,是否有一个"最佳实践"?在几乎所有情况下,我都使用PHP和MySQL,如果这对我应该处理细节的方式有任何不同.
附加信息Bounty
我想澄清一点,我知道这不是你想要做的事情,在大多数情况下拒绝这样做是最好的.但是,我并不是在寻找关于采取这种方法的优点的演讲我正在寻找采取这种方法时采取的最佳步骤.
在下面的一个注释中,我指出,当人们被要求执行安全的密码恢复程序时,主要针对老年人,智障人士或非常年轻人的网站可能会让人感到困惑.虽然在这些情况下我们可能会发现它简单而平凡,但有些用户需要额外的帮助,要么让服务技术人员帮助他们进入系统,要么将其直接通过电子邮件发送/显示给他们.
在这样的系统中,如果用户没有获得这种级别的访问协助,那么来自这些人口统计数据的流失率可能会阻碍应用程序,因此请记住这样的设置.
谢谢大家
这是一个有趣的问题,有很多争论,我很喜欢它.最后,我选择了一个保留密码安全性的答案(我不必保留纯文本或可恢复的密码),但也使我指定的用户群可以登录到系统而没有我从中找到的主要缺点正常的密码恢复.
由于不同的原因,我一直有大约5个答案,但我必须选择最好的答案 - 所有其他答案都是+1.感谢大家!
此外,感谢Stack社区中的每个人都投票赞成这个问题和/或将其标记为最喜欢的.我以100票赞成票作为赞美,并希望这次讨论能够帮助其他与我有同样关切的人.
我正在创建一个存储密码的应用程序,用户可以检索和查看密码.密码用于硬件设备,因此检查哈希是不可能的.
我需要知道的是:
如何在PHP中加密和解密密码?
使用加密密码最安全的算法是什么?
我在哪里存储私钥?
除了存储私钥,最好是要求用户在需要密码解密时输入私钥吗?(可以信任此应用程序的用户)
密码以什么方式被窃取和解密?我需要注意什么?
几天前我开始学习 Node.js,我面临着一个关于数据库和Gmail连接凭据的问题(最后一个是 需要的nodemailer)。
我基本上创建了一个这样的文件:
const config = {
development: {
url: '127.0.0.1',
database: {
host: 'mongodb://localhost',
port: '27017',
db: 'foo'
},
gmail: {
username: 'foo@gmail.com',
password: 'foo',
},
server: {
host: '127.0.0.1',
port: '3000'
}
},
production:{
url: 'https://my.site.com',
database: {
host: '127.0.0.1',
port: '27017',
db: 'foo'
},
gmail: {
username: 'foo@gmail.com',
password: 'foo',
},
server: {
host: '127.0.0.1',
port: '3000'
}
}
};
module.exports = config;
Run Code Online (Sandbox Code Playgroud)
我不喜欢在应用程序中输入这些信息,所以经过一些研究,我找到了这个库:dotenv。该库将信息存储在process.env属性内,但实质是相同的......为什么我应该更喜欢像dotenv针对我的config模块的解决方案? …
我有一个NODEJS代码可以连接到MySql数据库:
var mysql = require('mysql')
var express = require('express')
var app = express()
var connection = mysql.createPool({
connectionLimit: 50,
host : 'ip',
user : 'username',
password : 'pass',
database : 'mydb'
});
app.get('/', function(req, resp) {
connection.getConnection(function(error, tempCont) {
if(!!error) {
tempCont.release();
console.log('Error');
} else {
console.log('Connected!');
tempCont.query("select * from table", function(error, rows, fields) {
tempCont.release();
if(!!error) {
console.log('Error in the query');
} else {
resp.json(rows);
}
});
}
})
})
console.log("listening requests...")
app.listen(1337);
Run Code Online (Sandbox Code Playgroud)
如何保护用于连接数据库的ip,用户名和密码,以便在代码或配置文件中不可见?