Recommended Posts

I've had this thought for a while - but always figured there was a reasonable solution to it.

 

I run a CMS system that currently hashes its passwords into MD5 and then into SHA1 passwords - or SHA256, depending on the system.

I've always thought why can't you hash passwords a lot, to make them more secure.

 

For example:

<?php
$password = 'ilovepassword1';
$securepass = sha1(md5(md5(sha1(md5(sha1($password))))));

echo $securepass;
?>

Apart from it being totally stupid, and inefficient - why isn't this a 'proper' solution?

 

Surely to crack it, you'd have to crack every layer- in the example above, 6 layers?

 

 

Would love an answer!

 

 

Tim

It's better to just generate a random salt and encrypt with that. You could also generate six random salts and hash with each one, or whatever other series you'd like.

 

If you read the news, though, you'll find that many of the sites have all of their users passwords released either stored them in plaintext(!), or didn't salt them, or did other generally terrible things.

To give my non-expert opinion on your example:

 

MD5 is broken and should be avoided altogether. There hasn't been a demonstrated attack against SHA-1 yet, but there are ever more effective theoretical attacks against it, so it's time to move away from SHA-1.

 

SHA-1 has an output of 160 bits whereas MD5 only has an output of 128 bits. By alternating between the two algorithms, you're limiting the amount of entropy to 128-bits at most.

 

As others have said, add a random salt which prevents attacks involving hash tables and rainbow tables.

 

Also consider key stretching which increases the time to calculate each hash; while it may seem counterintuitive, the longer it takes to hash a password, the slower brute force and dictionary attacks are. There's a time period between when you get hacked and when you know you got hacked. Key stretching increases the amount of time it takes to perform a dictionary attack on the hashes, which gives you more time to detect the hack and force a password reset on all your users, reducing the number of compromised accounts.

  • Like 4

Why should it be more secure? Why shouldn't it be less secure? Can you prove it? Do you have any idea how? 

 

Cryptography is really ######ing hard; only qualified experts can tell that a certain algorithm is secure or not. As far as I'm aware, no expert has ever validated that "chained md5" is secure at all. Rely on known algorithms and don't try to devise your own, unless you really know what you're doing (and you probably don't).

  • Like 2

It's more secure against dictionary attacks and rainbow tables, anyone that tells you otherwise is a grade A ****ing idiot.

It makes it weaker to collisions though.

 

People that go on about 'oh double hashing doesn't improve security' really need to have their ability to talk taken away.

Here's a quick example; If a hashing mechanism outputs a 32 character code from any input, and for A you run it once and B you run it twice:

A can be found in a lookup table expecially if it's less than 13 characters. A can also be found using a dictionary or brute-force attack.

B will not be found in a lookup table because it's 32 characters. If someone can provide even a 16 character rainbow table for MD5 (which is known to be broken) please, do. B will not be found in a dictionary attack _AT ALL_ and is incredibly unlikely to be found via a bruteforce attack UNLESS a collision is found. If a collision is found, they have an alternative string that hashes to give the correct MD5 hash, they can't they crack that string to get the original data used for the first MD5 though.

 

The real problems are, if someone has access to your site and database whereby they can read off all the hashed passwords, they can change any password to login to any account so don't need to crack the password at all, if however they want to get something else like a bank account or email account and the person has used the same password for both sites, that's what they'd be cracking the password for.

I'd think devising a way to randomly rehash passwords at random time intervals may be more beneficial in providing security than devising a way to layer or chain things together.

I'm not a crypto expert but I love learning how the DSS, console, and cellular technologies encrypt and secure their 1's and 0's. From watching these industry leaders it seems real-time internet connected scenarios where the wheel (encryption) can be reinvented/changed at will, or several wheels (encryption keys) working in a phase-shift-keying routine seems more successful than layering or chaining encryptions off one another. Key in encryption is not to rely anything on anything else.. I hope I am making sense here. Sony lasted like 4 years just obfuscating static random numbers before the 3.55 signing bug was discovered. Microsoft lasted like 6 before someone figured out their processor favored 'ok' results when you just blanked the key half-way through its check. If theres a will theres a way, just hope by the time its figured out it the encryption is pointless.

The real problems are, if someone has access to your site and database whereby they can read off all the hashed passwords, they can change any password to login to any account so don't need to crack the password at all, if however they want to get something else like a bank account or email account and the person has used the same password for both sites, that's what they'd be cracking the password for.

 

Which makes the point that strong hash and properly random salt is enough. Instead of wasting server's compute time which is expensive one should focus on other potential weak links. It's easier to compromise the system through someone's idiocy or oversight than brute forcing - a determined attacker will look for existing holes before resorting to making his own.

This belongs to security through obscurity and works unprovably fine, but *only* until attacker gains access to the source code and therefore your method. In web applications he most likely already has such access, so he knows that you're double hashing and it's all for naught.

Which makes the point that strong hash and properly random salt is enough. Instead of wasting server's compute time which is expensive one should focus on other potential weak links. It's easier to compromise the system through someone's idiocy or oversight than brute forcing - a determined attacker will look for existing holes before resorting to making his own.

This belongs to security through obscurity and works unprovably fine, but *only* until attacker gains access to the source code and therefore your method. In web applications he most likely already has such access, so he knows that you're double hashing and it's all for naught.

What's it got to do with anyone gaining access to your code? If someone knows which encryption systems you're using and in which order makes no difference to anything.

They'll only crack the password if they need to for other uses and if they can get their hands on the hashed passwords which would imply they already have full database access. You can usually guess by the length of a hash what type it is.

If all they've got is access to your front end and are trying frantically to crack a user account, it really makes no difference what encyption you are using, how many different times you use it or if you even use encryption at all.

It's more secure against dictionary attacks and rainbow tables, anyone that tells you otherwise is a grade A ****ing idiot.

It makes it weaker to collisions though.

 

People that go on about 'oh double hashing doesn't improve security' really need to have their ability to talk taken away.

Here's a quick example; If a hashing mechanism outputs a 32 character code from any input, and for A you run it once and B you run it twice:

A can be found in a lookup table expecially if it's less than 13 characters. A can also be found using a dictionary or brute-force attack.

B will not be found in a lookup table because it's 32 characters. If someone can provide even a 16 character rainbow table for MD5 (which is known to be broken) please, do. B will not be found in a dictionary attack _AT ALL_ and is incredibly unlikely to be found via a bruteforce attack UNLESS a collision is found. If a collision is found, they have an alternative string that hashes to give the correct MD5 hash, they can't they crack that string to get the original data used for the first MD5 though.

 

The real problems are, if someone has access to your site and database whereby they can read off all the hashed passwords, they can change any password to login to any account so don't need to crack the password at all, if however they want to get something else like a bank account or email account and the person has used the same password for both sites, that's what they'd be cracking the password for.

It doesn't matter how many hash functions you chain together, the fact remains that, in the end, the same password will always produce the same hash. Therefore, you can produce a table for it. The most secure way to protect against hash/rainbow table attacks is to include a random salt so that the same password will produce a different hash each and every time. Doing it any other way is only putting the security of your users at risk.

  • Like 2

It's more secure against dictionary attacks and rainbow tables, anyone that tells you otherwise is a grade A ****ing idiot.

It makes it weaker to collisions though.

 

People that go on about 'oh double hashing doesn't improve security' really need to have their ability to talk taken away.

Here's a quick example; If a hashing mechanism outputs a 32 character code from any input, and for A you run it once and B you run it twice:

A can be found in a lookup table expecially if it's less than 13 characters. A can also be found using a dictionary or brute-force attack.

B will not be found in a lookup table because it's 32 characters. If someone can provide even a 16 character rainbow table for MD5 (which is known to be broken) please, do. B will not be found in a dictionary attack _AT ALL_ and is incredibly unlikely to be found via a bruteforce attack UNLESS a collision is found. If a collision is found, they have an alternative string that hashes to give the correct MD5 hash, they can't they crack that string to get the original data used for the first MD5 though.

 

The real problems are, if someone has access to your site and database whereby they can read off all the hashed passwords, they can change any password to login to any account so don't need to crack the password at all, if however they want to get something else like a bank account or email account and the person has used the same password for both sites, that's what they'd be cracking the password for.

 

Genius, so the solution to security is to append 1111111111111111 to all passwords before hashing. Since the password is now 32 characters it won't be found in a rainbow table :/ 

Hashing is multiple times can work most of the time but using salt is a more common practice (in my experience). With that you can use different techniques to use the salt (https://www.neowin.net/forum/topic/1163508-web-server-salt-storage/)

 

Some more good info http://crackstation.net/hashing-security.htm

It doesn't matter how many hash functions you chain together, the fact remains that, in the end, the same password will always produce the same hash. Therefore, you can produce a table for it. The most secure way to protect against hash/rainbow table attacks is to include a random salt so that the same password will produce a different hash each and every time. Doing it any other way is only putting the security of your users at risk.

Genius, so the solution to security is to append 1111111111111111 to all passwords before hashing. Since the password is now 32 characters it won't be found in a rainbow table :/

do u even read though?

So you're going to make a rainbow table of 32 character hashes? Seeing as it took 4 years of clustered computing to make the NTLM rainbow tables up to length 12, you're just talking straight out your arse. Yes I agree using salt is the best way to do it, but for the for-seeable future, 32 character or even longer length rainbow tables will not be appearing.

do u even read though?

So you're going to make a rainbow table of 32 character hashes? Seeing as it took 4 years of clustered computing to make the NTLM rainbow tables up to length 12, you're just talking straight out your arse. Yes I agree using salt is the best way to do it, but for the for-seeable future, 32 character or even longer length rainbow tables will not be appearing.

 

It sounds like you don't understand. This is how you would generate a hash table of MD5 hashes:

 

MD5(password) -> password

 

This is how you would generate a hash table of some chain of hash algorithms:

 

MD5(SHA1(SHA1(MD5(SHA1(MD5(password)))))) -> password

 

The point is to store the final hash, not the intermediary hashes.

 

For simplicities take, lets pretend that you only generated an 8-bit salt, creating 256 possible hashes for each password. To generate a hash table for that, you would need to store every possible salt with each password:

 

MD5(SHA1(SHA1(MD5(SHA1(MD5(password + 00000000)))))) -> password

MD5(SHA1(SHA1(MD5(SHA1(MD5(password + 00000001)))))) -> password

MD5(SHA1(SHA1(MD5(SHA1(MD5(password + 00000010)))))) -> password

MD5(SHA1(SHA1(MD5(SHA1(MD5(password + 00000011)))))) -> password

etc.

 

Now if you generate a 128-bit salt for each password, that means 2^128 possible hashes for each password. That's a huge number of hashes to generate for even a single password, beyond the storage capacity of any system in the world, making it infeasible to generate a hash table or rainbow table.

 

Chaining hash algorithms together is useless as long as it means one hash per password, because you can still map each output hash to the input password that generated it.

  • Like 2

The true best-practice is to never ever design your own password storage alg. There are libraries out there for every language that are designed by people with much more security experience than you. For PHP, you should take a look at phpass.

I've had this thought for a while - but always figured there was a reasonable solution to it.

 

I run a CMS system that currently hashes its passwords into MD5 and then into SHA1 passwords - or SHA256, depending on the system.

I've always thought why can't you hash passwords a lot, to make them more secure.

 

For example:

<?php
$password = 'ilovepassword1';
$securepass = sha1(md5(md5(sha1(md5(sha1($password))))));

echo $securepass;
?>
Apart from it being totally stupid, and inefficient - why isn't this a 'proper' solution?

 

Surely to crack it, you'd have to crack every layer- in the example above, 6 layers?

 

 

Would love an answer!

 

 

Tim

Your assumption that such hashes have to be cracked one layer at a time MUST be based on an presumption that an attacker will have no knowledge of your algorithm (your choice of which hash functions are used and how they are chained, etc) and will be unable to determine it. In theory and based on this presumption: In terms of an attacker using lookup tables, when they lookup a hash they would find that the result is a string that's not the password itself but instead the hash from the parent hashing function. They would then need to look that up, and so on until they eventually get to the actual password. There is an inefficiency of having to do multiple lookups, but more crucially for this to actually work in practice, in order to actually be able to perform these lookups, the attacker would require lookup tables that cover the hashes of all possible hashes. Such tables cannot exist because they would require a vast amount of disk space to store. Only two chained hash functions could therefore actually suffice here to block lookup attacks.

You cannot rely upon this presumption though. If we assume that an attacker does somehow know the algorithm, then with a lookup table based attack, the attacker can compile lookup tables based on your specific algorithm prior to then attempting an attack on the stolen hashes. Understand that hashing algorithms are designed to be quick, so throwing in a few extra function calls isn't really going to significantly impact an attacker generating them. Furthermore in relation to brute-force/dictionary based attacks against an offline copy of the hashes, the impact of your algorithm in terms of speed of execution is going to be negligible.

Xinox and Asik also raised some excellent additional points earlier.

 

It's more secure against dictionary attacks and rainbow tables, anyone that tells you otherwise is a grade A ****ing idiot.

It makes it weaker to collisions though.

 

People that go on about 'oh double hashing doesn't improve security' really need to have their ability to talk taken away.

Here's a quick example; If a hashing mechanism outputs a 32 character code from any input, and for A you run it once and B you run it twice:

A can be found in a lookup table expecially if it's less than 13 characters. A can also be found using a dictionary or brute-force attack.

B will not be found in a lookup table because it's 32 characters. If someone can provide even a 16 character rainbow table for MD5 (which is known to be broken) please, do. B will not be found in a dictionary attack _AT ALL_ and is incredibly unlikely to be found via a bruteforce attack UNLESS a collision is found. If a collision is found, they have an alternative string that hashes to give the correct MD5 hash, they can't they crack that string to get the original data used for the first MD5 though.

 

The real problems are, if someone has access to your site and database whereby they can read off all the hashed passwords, they can change any password to login to any account so don't need to crack the password at all, if however they want to get something else like a bank account or email account and the person has used the same password for both sites, that's what they'd be cracking the password for.

Again, you're also simply presuming the attacker does not know the algorithm.

I don't know why you think that chaining is somehow "weaker to collisions". Chaining multiple instances of the same hash function simply transforms one hash to another. Why would the final hash we settle on be weaker in terms of collisions than the first hash. If we chain different hash functions such as md5 and sha1 together, then as Xinox pointed out, entropy and therefore security is reduced to that of the weakest function. Furthermore I believe (and I'm by no means an expert) that 'second preimage' resistance would also be reduced to that of the weakest algorithm, and chaining would make no difference compared to simply using that weakest function on its own.

Also, in regards to the "real problem" as you put it, you can't just blindly state that an attacker with access to a set of password hashes is guaranteed to have write access to the database and is therefore only going to crack a password in order to access accounts on other services. That's crap. An attacker may have simply gained access to a backup of a database not the actual live database itself, or may have found a flaw in a web application through which they have gained read-only access. Also, even if they did have the ability to switch a hash on a user record and therefore login to the account, it doesn't mean that that is the best option for the attacker, it might be more advantageous on certain services to gain access to accounts without the account owners being aware that a malicious entity also has access.

 

I'd think devising a way to randomly rehash passwords at random time intervals may be more beneficial in providing security than devising a way to layer or chain things together.

I'm not a crypto expert but I love learning how the DSS, console, and cellular technologies encrypt and secure their 1's and 0's. From watching these industry leaders it seems real-time internet connected scenarios where the wheel (encryption) can be reinvented/changed at will, or several wheels (encryption keys) working in a phase-shift-keying routine seems more successful than layering or chaining encryptions off one another. Key in encryption is not to rely anything on anything else.. I hope I am making sense here. Sony lasted like 4 years just obfuscating static random numbers before the 3.55 signing bug was discovered. Microsoft lasted like 6 before someone figured out their processor favored 'ok' results when you just blanked the key half-way through its check. If theres a will theres a way, just hope by the time its figured out it the encryption is pointless.

Since hashing is non-reversible, the only time you could perform an operation on a user's password would be when they provide it in the login form, so there's a limit to the ability to "randomly" do something with it. Also, "rehashing" passwords would make absolutely zero difference. The same string will always result in the same exact hash every time it goes through the algorithm. I'm sure you knew that though really... What I expect you're really suggesting is the concept of forcing users to change their passwords every so often, which from a security perspective may have a little merit to it, but wouldn't go down well with users. Really it's salting and good choice of hash function that are the crucial things here.

I disagree with your simple notion that the key to encryption is to not rely one thing on another; in cryptography this seems to me to be prevalent. Most if not all crypto relies on the discreet logarithm problem for instance. HTTPS relies on both public-key (asymmetric) and symmetric crypto. I could go on, but I'm just nit-picking :p

 

It doesn't matter how many hash functions you chain together, the fact remains that, in the end, the same password will always produce the same hash. Therefore, you can produce a table for it. The most secure way to protect against hash/rainbow table attacks is to include a random salt so that the same password will produce a different hash each and every time. Doing it any other way is only putting the security of your users at risk.

I think you might have missed that what he wrote has to be based on a presumption of the attacker not knowing the algorithm.

 

Genius, so the solution to security is to append 1111111111111111 to all passwords before hashing. Since the password is now 32 characters it won't be found in a rainbow table :/

You've completely misunderstood what he was talking about.

 

Hashing is multiple times can work most of the time but using salt is a more common practice (in my experience). With that you can use different techniques to use the salt (https://www.neowin.net/forum/topic/1163508-web-server-salt-storage/)

 

Some more good info http://crackstation.net/hashing-security.htm

I made some comments in the thread you linked to relating to your "different techniques to use the salt"!

 

do u even read though?

So you're going to make a rainbow table of 32 character hashes? Seeing as it took 4 years of clustered computing to make the NTLM rainbow tables up to length 12, you're just talking straight out your arse. Yes I agree using salt is the best way to do it, but for the for-seeable future, 32 character or even longer length rainbow tables will not be appearing.

Lots of misunderstanding going on here, you and Xinox are arguing from two completely different perspectives!

I don't see the multiple hashes making it less secure, but it doesn't really make it more secure either since while you're running multiple iterations of the hash function, they're "fast hashes", so you're not increasing the cost by a large extent. Something like bcrypt follows a similar design (where it iterates over the input multiple times), but it does it to increase the computational complexity of the entire hash computation (That is, it's designed to take a certain amount of time per hash, not a certain amount of iterations)

Regarding salts, instead of using just one salt for all accounts (I've seen that suggested/used before), use a random salt per user (like their username). Even without something like bcrypt that would defeat rainbow tables in the case where the attacker is trying multiple accounts (While if the attacker is just targeting one account, like an admin, it won't help at all, that's where bcrypt comes in)

So for anyone that says that double or triple or n+ hashing doesn't make it secure, put your money where your mouth is;

342a404105b959b98bf4c52af0732e6b

MD5 hash of an MD5 hash of a simple password.

And if in 7 days you can't produce either the original MD5 nor the original text, we'll just assume like previously predicted; you're wrong.

How about you take your childish contests elsewhere and just understand that one plaintext produces one hash no matter how many times you hash it. Or one shirt stays one shirt now matter how many times you wash it.

 

I take a dictionary, I hash every entry from aaa to zzz (for example) of it:

MD5('aaa') = 47bce5c74f589f4867dbd57e9ca9f808

MD5('zzz') = f3abb86bd34cf4d52698f14c0da1dc60

 

Then I hash every result once more, because you've just told me that's what you did (or I might have found it myself because I'd got read access to your source code):

MD5('47bce5c74f589f4867dbd57e9ca9f808') = d4fbb7d8d5603db43ac2094f5955787c

MD5('f3abb86bd34cf4d52698f14c0da1dc60') = 689505e20843a46d0f9afaaf837dcb2b

 

And I come to know that:

MD5(MD5('aaa')) = d4fbb7d8d5603db43ac2094f5955787c

 

It works that way, not backwards. It's not even crypto 101, it's elementary school. Seriously, are you trolling us all?

  • Like 4

How about you take your childish contests elsewhere and just understand that one plaintext produces one hash no matter how many times you hash it. Or one shirt stays one shirt now matter how many times you wash it.

 

I take a dictionary, I hash every entry from aaa to zzz (for example) of it:

MD5('aaa') = 47bce5c74f589f4867dbd57e9ca9f808

MD5('zzz') = f3abb86bd34cf4d52698f14c0da1dc60

 

Then I hash every result once more, because you've just told me that's what you did (or I might have found it myself because I'd got read access to your source code):

MD5('47bce5c74f589f4867dbd57e9ca9f808') = d4fbb7d8d5603db43ac2094f5955787c

MD5('f3abb86bd34cf4d52698f14c0da1dc60') = 689505e20843a46d0f9afaaf837dcb2b

 

And I come to know that:

MD5(MD5('aaa')) = d4fbb7d8d5603db43ac2094f5955787c

 

It works that way, not backwards. It's not even crypto 101, it's elementary school. Seriously, are you trolling us all?

Why don't you learn to ****ing read?

Using a salt means the salt is known, include salt in the cracking system.

Salts do not slow down cracking or stop dictionary/bruteforce attacks from working, all they do is stop rainbow tables.

An md5 hash of an md5 hash also stops rainbow table attacks because THERE ARE NO RAINBOW TABLES OF THE MD5 HASHES, WILL YOU PLEASE RE-READ UNTIL YOU FINALLY UNDERSTAND?

tldr; MD5'ing an MD5 stops rainbow table attacks like salting does, neither method stops or slows down dictionary/bruteforce attacks.

Sure, with certain certainty, no one has computed such rainbow tables for me, but it's increasingly possible to do and when it's done, your method is fscked, which is unacceptable. I don't even need rainbow tables of MD5 hashes. I don't care of intermediary MD5 values just as I don't care of the number of rounds MD5 internally does. I mash the password any number of times and feed only the final value to the reduction function.

 

Instead we settle for the proven best method - proper salt, which instead makes rainbow tables *not even worth considering* rather than a increasingly feasible option.

 

Perhaps it'd also help if you'd turn down the rage dial a little.

An md5 hash of an md5 hash also stops rainbow table attacks because THERE ARE NO RAINBOW TABLES OF THE MD5 HASHES, WILL YOU PLEASE RE-READ UNTIL YOU FINALLY UNDERSTAND?

 

You do realise that the md5 hashes have a small number of characters and a fixed length. The original MD5 (the hash of the password) is trivial to find because you know its exact length and what characters are in it!

You do realise that the md5 hashes have a small number of characters and a fixed length. The original MD5 (the hash of the password) is trivial to find because you know its exact length and what characters are in it!

 

Right, sha1(md5(password)) is... well, it's silly.

 

Adding salt prevents the generation of rainbow tables, adding iterations prevents (or at least, makes less feasible) brute force attacks. Both of these ideas have been used in modern encryption algorithms, there's not a good reason to try and cobble together something using md5 hashes.

 

The real concern is, if someone gets access to your entire database, what information to they now have? That's what often gets overlooked by sites.

This topic is now closed to further replies.
  • Posts

    • In the way that you framed it incorrectly. You wrote: "The constant need to close all browser sessions and wait for a new version to install" There's no "constant need to close all browser sessions". That's factually incorrect. The browser downloads its updates in the background and installs them when you open it again. Silently. And there's no "wait for a new version to install", updates are small and take 2-3 extra seconds AT MOST, if any. If you have an SSD, there's zero extra time. Also, every mainstream browser operates this way. Firefox, the FOSS go-to browser, the default on almost every Linux distro, does exactly the same. Also, you don't need to constantly restart Edge for updates to install, you can completely ignore them and it doesn't even ask you to handle them, it's all silent and automatic. So I don't understand what else do you want.
    • DuRoBo Krono Review: Portable E-Ink reader with great ideas that need a bit of improvement by Taras Buria Phone-sized e-readers are gaining traction these days, with more people treating them as a getaway device to cure phone addiction (or at least they are trying to) or having a more pocket-friendly reader that is easier to carry and hold. The market now has plenty of such readers to choose from, and DuRoBo is the latest addition, a new player that offers a more interesting approach to the idea. The Krono is a $279 e-reader with an interesting twist, which tries to make the device more fun and ergonomic. Here is my review. Disclaimer: DuRoBo provided the review sample without any editorial input or pre-approval. The Krono comes in a phone-sized box with pink accents. Inside, you get the device itself, a short user manual, and a USB cable. The cable is a bit old-fashioned, Type-A to Type-C, which is a bit disappointing. Hot take: I would rather have no cable in the box rather than another Type-A cable that gets immediately thrown into my box full of similar cables I never use. The Krono also has no charger in the box, as it relies on accessories you already own, which is fine with me. Here are the specs: Dimensions 154 x 80 x 9.0 mm or 6.06" x 3.15" x 0.35" 173 g or 6.10 oz Materials Black or White plastic Display 6.13-inch E-Ink Carta 1200, 1,648 x 824 pixels, 300 ppi Touch-capacitive. Dual-tone frontlight. Processor 8-core Qualcomm Snapdragon 690 (QTI SM6350) 2 performance cores at 2.07 GHz 4 efficiency cores at 1.71 GHz Memory 6 GB Storage 128GB, non-expandable ~104GB available out-of-the-box Operating system Android 15 with a custom launcher Connectivity Wi-Fi and Bluetooth Battery 3,950 mAh battery Buttons and port USB Type-C port Power button, Volume button, Smart Dial Breathing Lights Audio Mono Speaker and Dual microphones In the box The Krono, a Type-A to Type-C cable, user manual Price $279 on Amazon First impressions Right off the bat, no, this is not a phone replacement. Do not approach this device thinking it can serve you as a dumb phone to cure your TikTok addiction. In addition to the fact that the Krono has no cellular connectivity, I strongly believe that no amount of extra devices can fix your phone addiction until you put some serious effort into it. The Krono is a phone-sized e-reader, a companion for your phone dedicated to reading without distractions. The DuRoBo Krono is made of plastic with a very fine texture. It is hardly premium, but I also cannot say it feels cheap. The device is also a bit thick, quite dense, and well-built without rattling or cracking. You get to choose between two colors: white and black. The front has quite thick bezels, which is hardly surprising for an e-ink device. These things use front light, with LEDs usually placed on the screen perimeter. While I do not mind thicker bezels, the notably larger chin cheapens the look a little. What I mind is a notable seam between the display and the main case, which, after just two days of use, collected plenty of dust and specks. The back of the Krono is what makes the device stand out. There is a cylinder (DuRoBo calls it the Axis) embedded in the back of the reader, housing three elements: a power button on the right edge, a Smart Dial on the left edge, and "Breathing Lights" on the back. An etched DuRoBo logo sits below the cylinder, and it is the only piece of branding you can find on the device. Overall, the design and materials are very unassuming, but the cylinder with additional control elements certainly elevates the look and makes it more interesting. Other physical elements include two microphones (one on the top edge and one on the bottom edge), a USB Type-C port, a volume rocker, and a single mono speaker. There is no fingerprint reader, so if you want to protect your device, a PIN is your only option. The official TPU case is not the most premium-looking Display The Krono has a 6.1-inch E-Ink Carta 1200 touchscreen display with a resolution of 1,648 x 824 pixels (300 ppi). The display is front-lit, and you can adjust the brightness and temperature from cool to warm. Unfortunately, the Krono lacks automatic brightness and temperature adjustments, and you cannot set a custom schedule for the frontlight. However, you can set it to always enable frontlight so that you can see what is happening on the screen when turning it on in a dark environment. On the bright side (get it?), the front light can get extremely dim so that the screen is barely readable in a pitch-dark room. The front light is also uniform across the screen, with no noticeable temperature gradients. I am very susceptible to uneven front light, and it is very easy for me to notice it, but the Krono is doing a very good job in this area. I also like that the edge shadow is not very prominent and barely visible in the black variant. E-Ink Carta 1200 is not the newest generation (there are Carta 1250 and 1300), but it is still a good display. It supports three modes: Clarity, Speed, and Quality. In Clarity mode, text is very sharp and easy to read, but you trade that for more ghosting, a slower refresh rate, and more artifacts when the display changes images. Speed mode, as the name suggests, boosts refresh rate and reduces ghosting, but fine print and text become more jagged. Finally, Quality mode is only available in Android apps. It has the lowest refresh rate, but in return, you get much better visuals, improved gradients, and more. Like brightness and temperature, you can toggle modes from the control center. It is available when swiping from the top-right corner of the screen (the top-left is for notifications). I also like that the Krono can work as a desk clock when not in use. It has a bunch of screensavers, including horizontal clocks with time, date, and current battery level. The screen refreshes once per minute, and battery drain is extremely low (not even 1% in 24 hours). It is a great use of the technology, and another thing I wish more e-ink devices featured. Smart Dial The Smart Dial is Krono's main party trick. It sits on the left side of the device and serves multiple purposes. You can twist or press it to perform various actions, depending on the current use case scenario. When reading books, twisting the dial flips through pages, and pressing it refreshes the screen. On the home screen, the dial adjusts the brightness, and holding the dial pressed launches voice note recording. Finally, a quick double press launches the DuRoBo AI chatbot. While the dial scroll is not notched, it is very smooth and has haptic feedback that confirms your actions, which feels very nice. As a long-term Apple Watch user, I love the idea behind the dial. It feels very natural and oddly satisfying to use, especially with that subtle haptic feedback. I never liked flipping pages with touch input, and I strongly believe each e-reader should come with some sort of physical controls for turning pages. The Krono has both volume buttons (which also work as page turners) and the dial, so you are free to use whichever you prefer. With that said, the dial is not perfect. For one, it sticks out of the case way too far for my liking, raising concerns about durability and longevity when carrying the Krono around in a pocket (it is a pocket-sized device after all). Also, it has too much wobble, which cheapens the experience and makes it feel a bit flimsy and unsecured. While there are two plastic guards on the Krono's case, they are way too small for any kind of protection. I also think DuRoBo should let users customize dial actions (the only available customization is scroll direction), particularly for long and double presses. Not everyone needs voice notes, and DuRoBo AI does not work without an active internet connection, leaving the long press essentially useless when offline. I do not mind these features, and I genuinely think they are useful, but I would rather have the ability to toggle between screen modes, turn the frontlight on/off, or launch my favorite app. I also agree with people on Reddit asking developers to let users adjust the dial sensitivity. I hope this is something DuRoBo can implement with a software update to make the experience more personalized (it is a Smart Dial, after all) and incentivize users to fiddle with the Dial more often. The Dial is a fantastic idea, so please, guys, improve it a little. As for ergonomics, they are mostly fine, but the dial's position may feel a little awkward and way too high. When I use a phone or a phone-sized gadget, I tend to rest one of its corners on my palm for a more secure grip. With the Krono, such a grip is impossible because you cannot reach the dial even with big hands. You have to lower the reader a bit and hold it like a bottle without any extra support for the bottom edge. Such a grip is not necessarily uncomfortable (the Krono is also light enough for it), but it requires a bit of muscle retraining. Sometimes, I do not bother with the dial and hold the Krono like my phone, flipping through pages with volume buttons, as they are perfectly positioned for my right-hand thumb. Interestingly, when testing the Krono, I would often find myself thinking that a roller embedded in the long plastic cylinder on the back of the device would have been a much more comfortable solution. There is a free idea for you, guys. Software The Krono runs Android 15 with a very minimal launcher on top. The home screen presents you with a list of apps, a scrollable list of widgets, and your user profile. Widgets can display time, calendar, or recent books for quick access. You can also add or remove apps from the home screen to keep the most useful stuff around without tapping "Apps." I like this minimalistic approach; it looks clean, easy to understand, and light. I understand that some may find the list of all apps way too clean, but fortunately, DuRoBo lets you switch to traditional icons. The reader also has a bunch of preinstalled apps: Read: The default app for reading. Browser: A Chromium-based browser. Files: A simple file manager. Music: A simple music player. Spark: A voice recorder with transcription support and AI summarization DuRoBo AI: A built-in AI chatbot. Transfer: An app for file transfer over Wi-Fi. If that is not enough, there is the Google Play Store, where you can download all the extra apps you need, alternative readers, podcast apps, chatbots, and more. DuRoBo is not trying to give you an all-in-one device. The standard software experience is quite minimal, which makes it easy to approach and learn. The standard reader supports EPUB, EPUB3, AZW3, MOBI, PDF, TXT, DOC, and DOCX, which is more than enough to let you read most books without third-party software. As for customizing the reading experience, you can select one of five built-in fonts, adjust size and thickness, adjust margins and spacing (only three variants for each), change text alignment and direction, toggle the reading status bar, and switch to dark mode. There is also text-to-speech, which utilizes Android's default TTS tech. While I like the simplistic approach, I cannot help but feel DuRoBo could have made the built-in reader a bit more customizable. However, I am not going to bog down on this, as you can always install any other reader you prefer using the Play Store or by sideloading an APK. Getting books to the Krono is very simple. Given that the device is an Android smartphone without cellular connectivity, you can transfer files via a USB Type-C cable, download them using the built-in browser, share them over Bluetooth, or use cloud storage. My favorite was the built-in Transfer app. It is simple, reliable, and very well-designed. I was surprised by how well-designed the web portal is. It is fast, pretty, and properly categorized. Well done! Once you have your books loaded, you can highlight or underline text, add annotations, bookmark pages, check the table of contents, and ask AI about the selected text. Unfortunately, the Krono has no built-in vocabulary, but again, that is something a third-party reader could fix. Overall, the built-in reader is light and snappy, with just the minimum amount of features for a regular user to enjoy reading books. The Krono has no built-in reading tracking, so stat nerds will have to look for third-party reading apps. However, you can set a daily reading goal, and the reader will notify you when you reach it (for example, one hour). You can also set a reminder to read at a certain time, and when the time comes, the Krono will light up its back LEDs and unlock itself to nudge you. Other than that, the rear LEDs do nothing, not even showing charging progress, which is an unfortunate misopportunity if you ask me. Quirks aside, Krono's Android runs quite snappily and bug-free. Early reviews of the Krono criticized its Android 13-based software quite a lot, but now, the reader runs Android 15, and its software has fixed plenty of initial complaints. I never experienced any issues with built-in apps. AI attempts The DuRoBo Krono comes with a built-in AI chatbot. There is no information on what model powers this thing, but the system says it was "trained by Google." You can launch the bot from the app list or by double-pressing the dial. It works just like any other chatbot, and you can ask it anything by typing or using voice input. The AI saves your chats, and you can rename, export, or delete them. DuRoBo AI requires an active internet connection, and it does not work offline. Its reach and capabilities are also limited. You can only chat in the app and use it in the reader app as a makeshift vocabulary. However, the implementation is kinda awkward. You can only send a selected portion of text to AI without giving it any requests or instructions. I highlighted the word "dumb," and it apologized to me for not being useful. You also cannot ask follow-up questions or send the generated response to a separate chat. The chatbot is also slow, even with fast Wi-Fi, making the overall experience quite frustrating, which makes me again wish for the ability to remap the double press to something else. Spark, the standard voice recording app, also uses AI for note summarization and transcribing. Neither feature works offline, unfortunately. Spark records notes up to 30 minutes using Krono's dual microphones, and you can rename or export notes. Transcription quality is decent, and the speed is alright, but you can find much better solutions in the Google Play Store. What I like about Spark is that transcribed notes are not locked, and you can always type more to elaborate on your ideas, which is handy. Overall, I like that the Krono is not shoving AI down my throat, but to be honest, there is really not that much to shove. AI features here feel raw and need improvements to be more useful. Battery Life Like most E-Ink readers, the Krono has fantastic battery life. Even with a clock as a screensaver, its standby power consumption is incredibly low. And when in use, you can get weeks of reading on a single charge. Without the front light, my unit never sipped more than one or two percent of battery during a one-hour reading session. It was nice to see plenty of battery-related settings. You can limit charging at 80% to protect battery health long-term, check the number of charging cycles, manufacturing/first-time use date, battery health, and the maximum capacity. Additionally, the Krono lets you select what hardware remains enabled when sleeping. This lets you keep Wi-Fi and Bluetooth on (say, if you want to receive notifications, for some reason) and keep audio playing when locked. Turning these features off effectively eliminates any standby battery drain. I left my Krono sitting for 24 hours with a clock screensaver on, and it did not drop a single percent. The pretty big 3,950 mAh battery justifies the device's thickness and ensures you do not have to charge it for long periods. Speaking of charging, it is capped at only 10W, which is a bit disappointing, as getting such a big battery to 100% takes a notably long time in the era of super-fast charging smartphones. DuRoBo Moodi The Moodi is a standalone, optional accessory for your Krono. It is a wireless remote with two customizable buttons that you can use to flip pages, control media, or scroll webpages. The accessory connects via Bluetooth. Despite having a built-in rechargeable battery, it is extremely light. While the Moodi's shape and form factor is not what I would call particularly ergonomic, it is not uncomfortable to hold and use. The Moodi comes with six removable magnetic buttons with various smiley faces. Buttons sit securely, and they have nice-feeling, albeit a little loud, clicks. It is a cute touch that adds a little more fun and character to the device. There is also an accented power button and a single status LED. The latter displays charging status and connection mode. The Moodi supports three modes: Reading: Buttons work as volume buttons, allowing you to flip pages in the built-in reader or other apps that support page turning with volume buttons. Media: Buttons work as skip forward/backward, which is useful when listening to audiobooks, podcasts, or music. Scroll: The third mode lets you scroll pages in the web browser or any other application The Krono properly detects the Moodi and presents you with an on-screen guide when you connect it for the first time (it also displays the battery level). However, you can only change modes by holding both buttons for a few seconds. It is also worth noting that the Moodi works with other devices. I connected it to my iPhone and it let me adjust volume or control media playback. Sadly, the scroll did not work, so you cannot use it to waste time scrolling TikToks. Overall, the Moodi is a cute little accessory, which I can recommend for those who read a lot. It is very useful for remote page flipping when you do not want to burden your hands by holding the Krono all the time. I only wish DuRoBo included a lanyard for the built-in loop. As for the battery life, after using the Moodi for a few days, I only managed to drop several percent of its 90 mAh battery. Despite the small size, it is rated for weeks of use, which is pretty impressive. At $35.99, I cannot say the Moodi is a must-have accessory, but I see the appeal. I prefer using the Krono with its Smart Dial, as I rarely read for more than 40-60 minutes in one sitting. However, if you have a stand and like reading for long periods, the Moodi is the right thing to have. It is a bit more expensive than regular page flippers on Amazon, but it is on par with similar products from Kobo or BOOX. Plus, it has a little more fun to it with removable buttons and better integration into the Krono. Conclusion At the end of the day, DuRoBo Krono is a nice pocket-sized e-reader. Its software focuses on the main things without trying to be everything at once. The smart dial idea is unique and great, and I wish more manufacturers had something similar in their devices. The display is also good, with an even frontlight and "always-on" support. I did not notice any deal-breaking issues with the Krono. However, you can feel that the idea needs some improvements, such as a slightly stiffer dial in a more ergonomic location, perhaps a little more premium materials, and better software customization. I hope the company won't give up on the idea and improve the dial and ergonomics in the second generation. Buy DuRoBo Krono Black - $279.99 on Amazon Buy DuRoBo Krono White - $279.99 on Amazon Buy DuRoBo Moodi - $35.99 on Amazon As an Amazon Associate, we earn from qualifying purchases.
    • In what way is any of what I said incorrect? To install an update you need to close all browser instances, upping it from once a month to once a fortnight is an inconvenience for users. Particularly when updates don't offer functionality that users want (notably copilot). Security updates should come as they are needed, not on a release schedule
    • Dopamine 3.0.6 by Razvan Serea Dopamine is an awesome free audio player which tries to make organizing and listening to music as simple and pretty as possible. Dopamine has been designed for Windows 7, Windows 8.x and Windows 10 and plays mp3, ogg vorbis, flac, wma and m4a/aac music formats quite well. The best part? It's created by long-time Neowin member, Raphaël Godart. If you’re looking for a music player to handle a large music collection, you should definitely give Dopamine a try. Dopamine 3.0.6 changelog: Fixed Manually edited album covers are overwritten on the next collection refresh Fixed AppImage package not working on modern GNU/Linux distributions Deleting song from playlist sometimes fails Playback controls only work when clicking on upper half of the buttons It's unclear that files must be tagged with an external ReplayGain scanner (for example rsgain) before normalization can take effect. Change to Artist or Album tags is not reflected in the song list view nor in the Now Playing information ReplayGain issues Smart playlist filters ignore text containing accents or other special characters Some MP3 files trigger an "MPEG header not found" error due to a too-narrow initial MPEG header scan range Changed Updated the Vietnamese translation Download: Dopamine 3.0.6 | 122.0 MB (Open Source) Links: Home Page | Forum Discussion | Screenshot | Other OSes Get alerted to all of our Software updates on Twitter at @NeowinSoftware
  • Recent Achievements

    • One Month Later
      AndreaB earned a badge
      One Month Later
    • One Month Later
      agatameier earned a badge
      One Month Later
    • Week One Done
      agatameier earned a badge
      Week One Done
    • Week One Done
      ssd21345 earned a badge
      Week One Done
    • Contributor
      MarkHughes4096 went up a rank
      Contributor
  • Popular Contributors

    1. 1
      +primortal
      518
    2. 2
      +Edouard
      194
    3. 3
      PsYcHoKiLLa
      147
    4. 4
      ATLien_0
      96
    5. 5
      Steven P.
      76
  • Tell a friend

    Love Neowin? Tell a friend!