用户密码的加密方式


可以采用以下几种加密方式:

①MD5:存在冲突的情况;

②SHA1:可能被破解;

③PHP的crypt()函数;

可以额外传入一个salt字符串,则生成的加密字符串前两个字符取自salt字符串的前两个字符;

上述几种方式均有被破解的可能,为了提高破解难度,可以将用户名和密码字符串链接起来作为加密的输入;

注意:

当用户忘记密码时,不要将用户设置的密码邮件给用户,而可以代之以临时密码,或者邮件给用户一个可产生哈希值的链接让用户重设密码;






总结自文章: https://highedwebtech.com/2008/04/25/season-your-passwords-with-some-salt/




Season Your Passwords with some Salt

Let’s say you’re building a big new web app at your institution. One of the parts of this application will be storing usernames and passwords. There are a ton of ways to do this, but today I want to share with you one way that I do things, in the hopes of making my logins as secure as possible. For our examples today, we’ll be using PHP.


Before I get going too far, I should mention that when I say storing passwords, what we’re really doing is storing ahash of the user’s password. When we authenticate a user, we run the password they supply through whatever algorithm we’re using to encrypt and hash their input and we compare the result to what we’re storing in our database.

That being said, when storing passwords for your app, you have a many options. You could skip all security and store your users’ passwords in plain text in MySQL. Bad idea. You could use MySQL’s default password functionality. This is okay, but you could do things better.

For the rest of this post, let’s create a password variable, $pass. For all the examples, let’s set the value of $pass as “highedwebtech1”.

Let’s look at what’s generated when we pass the $pass variable through MD5.

echo md5($pass);

That gives us the following hash:

4fc86b20556f29a3291b5fb296189eff

That’s not a terrible way to store a password, but there’s been research for the last couple of years that its possible to create MD5 collisions – where you generate lists and lists of MD5 hashes and look for matches. For example, this site will look up your MD5 hashes and check for collisions.

Well, we could use SHA1 to encode the password. Let’s run our $pass variable through SHA1:

echo sha1($pass);

That gives this:

1f046ee5bdacf0842729674034e5d1cf8c3ce512

Getting better. But – SHA1’s been broken as well. The chances of your user accounts being brute-forced by someone running SHA1 collisions is very minute, but let’s keep searching for something better.

Let’s do some crazy hashing and mashing. Let’s look at PHP’s crypt function.

crypt() will return an encrypted string using the standard Unix DES-based encryption algorithm or alternative algorithms that may be available on the system.

If we run the following code:

echo crypt($pass);

We get the following:

12sO.2eqklceI

crypt() also allows you to add a salt. Wikipedia describes a salt thusly: “a salt comprises random bits that are used as one of the inputs to a key derivation function.” This basically means we can specify some characters that will become part of our encryption scheme.

Let’s create a $salt variable. We’ll give $salt a value of, for now, “yummysalt”.

Let’s run crypt() again but this time we’ll specify a specific salt. The system I’m running this on in these examples is using standard DES as its encryption.

echo crypt($pass,$salt);

This returns:

yupJSdhPX0e66

Standard DES puts the first 2 characters of the salt at the beginning of the hash of the password. If we use “yummysalt” as our salt (footnote – DES only uses the first 2 characters, we could have just made our salt “yu”), every time we run our password through crypt we will get the same value. The number of characters in your salt can depend on your system settings, including values in PHP and your server software.

Specifying a salt isn’t a bad thing to do, but you’ve got to now store that salt somewhere in your code. If your system is compromised, and with your salt, cracking passwords may be a little easier for your user passwords to be cracked.

If you’re sensing a theme here, you’d be right. DES is also susceptible to cracking, even when using a salt.

So, what’s a way to do it thats secure and has little chance of getting cracked? There are a lot of different ways to answer that question, but here’s some ideas I had, along with some help from a friend, who’s a security professional at a major research institution.

He recommends using something like the following, which is based on the username and password responses we receive from the user.

$username = "user1";
$password = "highedwebtech1";

echo sha1($username.$password);

In the code above, we’re creating a hash from a concatenation of the username and the password they enter. But, Mike, you say, a few paragraphs earlier you said SHA1 wasn’t the best choice. In this case though, we’re not hashing just the password. We’re hashing an entirely new value, in this case,user1highedwebtech1. That would be much more difficult to crack, especially using a brute-force attack. Here’s the hash value we get back from this function:

033e1ce0e67fce92ddf5cdf437d15b9967f4b307

It’s long, and difficult to crack. When it comes time for a user to log in, checking against what they enter is easy. Just put the two values together, run it through SHA1 and then compare that to the value we originally stored in the database.

It should also go without saying that you should never email a user’s password to them. Either send them a replacement, temporary password or make them reset it altogether by emailing them a link with a hashed value they need to reproduce. But that’s a whole other post.

Want to learn more about doing this stuff in PHP? I’d recommend reading about about the mcryptmodule. It offers a great deal of additional functionality.

Happy hashing!

What tips or tricks do you use when it comes to handling passwords? I’d like to learn how you deal with this issue.






































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值