Security 我是否可以通过编程方式登录到网站,而无需以明文形式存储密码?

Security 我是否可以通过编程方式登录到网站,而无需以明文形式存储密码?,security,authentication,screen-scraping,Security,Authentication,Screen Scraping,我做了很多项目,包括自动提交表单和/或从网站检索数据。其中一些站点需要用户名/密码身份验证。(这些网站没有API,所以我依靠屏幕抓取。) 我看到的大多数教程都将用户名和密码像其他帖子数据一样存储在源代码中,例如: string username = "someUserName"; string password = "somePassword"; // submit POST data... 但我知道用纯文本存储密码通常是不受欢迎的。是否有其他方法可以使用?存储密码的常用方法是对密码进行哈希运

我做了很多项目,包括自动提交表单和/或从网站检索数据。其中一些站点需要用户名/密码身份验证。(这些网站没有API,所以我依靠屏幕抓取。)

我看到的大多数教程都将用户名和密码像其他帖子数据一样存储在源代码中,例如:

string username = "someUserName";
string password = "somePassword";
// submit POST data...

但我知道用纯文本存储密码通常是不受欢迎的。是否有其他方法可以使用?

存储密码的常用方法是对密码进行哈希运算。因为大多数密码散列算法都是破坏性的,也就是说它们不能被逆转,所以这对你来说是行不通的

一种选择是使用可逆散列,例如对密码进行base64编码,但这并不比将密码存储在纯文本中更安全

据我所知,最好的解决方案是将密码存储在数据库中。如果您真的担心有人获得用户名和密码,您可以使用在DB中加密它们,或者使用SQLite数据库,直接在磁盘上加密


通过这种方式,您的代码和登录凭据被分离,您可以安全地与他人共享您的代码,而不必担心安全性。

一种非常简单的加密和解密方法是。我粘贴了维基百科的C++代码,但是请记住,任何人都可以在那里修改它。
#include <stdint.h>

/* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */

void encipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
    for (i=0; i < num_rounds; i++) {
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
    }
    v[0]=v0; v[1]=v1;
}

void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
    for (i=0; i < num_rounds; i++) {
        v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
        sum -= delta;
        v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
    }
    v[0]=v0; v[1]=v1;
}
#包括
/*取v[0]和v[1]中的64位数据和键[0]-键[3]中的128位数据*/
无效加密(无符号整数轮数,uint32\u t v[2],uint32\u t常量键[4]){
无符号整数i;
uint32_t v0=v[0],v1=v[1],和=0,增量=0x9E3779B9;
对于(i=0;i5))+v1^(sum+key[sum&3]);
总和+=增量;
v1+=((v0>5))+v0)^(和+键[(和>>11)和3]);
}
v[0]=v0;v[1]=v1;
}
无效解密(无符号整数次循环,uint32次循环[2],uint32次循环常数键[4]){
无符号整数i;
uint32_t v0=v[0],v1=v[1],delta=0x9E3779B9,和=delta*num_;
对于(i=0;i5))+v0)^(和+键[(和>>11)和3]);
总和-=增量;
v0-=((v1>5))+v1^(sum+key[sum&3]);
}
v[0]=v0;v[1]=v1;
}

你必须做两件事:
1.登录页面使用HTTPS(如有必要)
2.收到密码后立即使用密码加密。编码器是这样的:

private static String passwordEncryption(String oldPass){
    String newPass = "";
    try {
        MessageDigest messageDigest = MessageDigest.getInstance("MD5");  
        messageDigest.update(oldPass.getBytes(), 0, oldPass.length());  
        newPass = new BigInteger(1,messageDigest.digest()).toString(16);  
        if (newPass.length() < 32) {
            newPass = "0" + newPass; 
        }
        return newPass;
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return newPass;

}
私有静态字符串密码加密(字符串oldPass){
字符串newPass=“”;
试一试{
MessageDigest=MessageDigest.getInstance(“MD5”);
update(oldPass.getBytes(),0,oldPass.length());
newPass=newbigInteger(1,messageDigest.digest()).toString(16);
if(newPass.length()<32){
newPass=“0”+newPass;
}
返回新通行证;
}捕获(无算法异常){
e、 printStackTrace();
}
返回新通行证;
}

并使用MySql的MD5()函数将接收到的密码与存储的密码进行比较。

我们使用的模式是:

在数据库表中有一个加密列。此列包含使用系统范围的长(128位)随机密钥(通常存储在配置文件中)加密的数据。 此加密列中的数据包含用于每个第三方服务的单独(随机)密钥。使用此密码,我们加密与此第三方服务相关的身份验证详细信息

为什么要进行双重加密

您可以将纯文本中的密码数量减少为单个密码(系统范围的密码)。因此,密钥管理更容易。 我们为每个第三方服务创建一个长随机密钥,以便有选择地解密每个第三方服务的凭证,并在必要时在系统之间传输凭证。将我们的一个密钥存储在数据库之外还可以降低与SQL注入攻击(它们“仅”获取数据库数据)和备份(常规备份数据中不包括配置文件)相关的风险

明显的缺点是系统范围的密码。它需要在内存中的某个地方


我不是密码学家,我很确定上面的是次优的。但是,它可以工作,易于管理,并且比仅以纯文本形式存储第三方服务凭据安全得多。

没有办法做到这一点。它需要以纯文本(或“可逆加密”)的形式提供给脚本

许多API(包括AmazonWeb服务)都会建议在环境变量中设置凭据,这可能是您所希望的最大安全性


把它放到你的.bash_档案中,仔细检查一下,至少你可以确定它不会以公开回购的形式出现在github上。

我有一个需要解决这个问题的清理项目。我的设置包括两个独立的服务器。第一个是用户前端web应用程序。第二个是处理抓取的nodejs服务器

我使用openssl密钥对加密处理加密。我为nodejs机器生成一个密钥对,并将公钥提供给前端web应用程序。当用户注册其第三方凭据时,这些凭据将使用公钥加密并存储在数据库中

该web应用程序定期选择用户的加密凭据,并将其发送到节点服务器,在节点服务器上使用私钥对其进行解密,并与第三方一起用于抓取

在快速搜索之后,我找到了一篇关于使用openssl和加密字符串的文章


我意识到这是一篇非常古老的文章,但希望它能帮助下一个偶然发现这个问题的人。

在MySQL端使用
MD5()
是个错误的建议:明文密码可能/将最终出现在日志文件中。在什么意义上?算法容易破解吗?有趣的是:谢谢,我读了链接。