diff options
author | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2017-11-25 11:39:37 -0500 |
---|---|---|
committer | Rafael Mendonça França <rafaelmfranca@gmail.com> | 2017-11-25 11:39:37 -0500 |
commit | 0623b5d19408ef3093bef3597bfcb12cf70a08a3 (patch) | |
tree | 9027e49a5e270a5fe61088f3d38adb05854c88ed /activesupport/lib/active_support | |
parent | 8c750ffb92a8e5ee5661875c52dbc1a7686fb1bc (diff) | |
parent | fa487763d98ccf9c3e66fdb44f09af5c37a50fe5 (diff) | |
download | rails-0623b5d19408ef3093bef3597bfcb12cf70a08a3.tar.gz rails-0623b5d19408ef3093bef3597bfcb12cf70a08a3.tar.bz2 rails-0623b5d19408ef3093bef3597bfcb12cf70a08a3.zip |
Merge pull request #24510 from vipulnsward/make-variable_size_secure_compare-public
Make variable_size_secure_compare public
Diffstat (limited to 'activesupport/lib/active_support')
-rw-r--r-- | activesupport/lib/active_support/security_utils.rb | 22 |
1 files changed, 12 insertions, 10 deletions
diff --git a/activesupport/lib/active_support/security_utils.rb b/activesupport/lib/active_support/security_utils.rb index b6b31ef140..4d129bfe41 100644 --- a/activesupport/lib/active_support/security_utils.rb +++ b/activesupport/lib/active_support/security_utils.rb @@ -4,14 +4,12 @@ require "digest/sha2" module ActiveSupport module SecurityUtils - # Constant time string comparison. + # Constant time string comparison, for fixed length strings. # # The values compared should be of fixed length, such as strings - # that have already been processed by HMAC. This should not be used - # on variable length plaintext strings because it could leak length info - # via timing attacks. - def secure_compare(a, b) - return false unless a.bytesize == b.bytesize + # that have already been processed by HMAC. Raises in case of length mismatch. + def fixed_length_secure_compare(a, b) + raise ArgumentError, "string length mismatch." unless a.bytesize == b.bytesize l = a.unpack "C#{a.bytesize}" @@ -19,11 +17,15 @@ module ActiveSupport b.each_byte { |byte| res |= byte ^ l.shift } res == 0 end - module_function :secure_compare + module_function :fixed_length_secure_compare - def variable_size_secure_compare(a, b) # :nodoc: - secure_compare(::Digest::SHA256.hexdigest(a), ::Digest::SHA256.hexdigest(b)) + # Constant time string comparison, for variable length strings. + # + # The values are first processed by SHA256, so that we don't leak length info + # via timing attacks. + def secure_compare(a, b) + fixed_length_secure_compare(::Digest::SHA256.hexdigest(a), ::Digest::SHA256.hexdigest(b)) end - module_function :variable_size_secure_compare + module_function :secure_compare end end |