diff --git a/app/models/key.rb b/app/models/key.rb
index f5fc141985e0cb109ae059beb7edf428f395735d..902a7c5911654acee79cb98d4d855f15299d8f0c 100644
--- a/app/models/key.rb
+++ b/app/models/key.rb
@@ -21,11 +21,11 @@ class Key < ActiveRecord::Base
 
   attr_accessible :key, :title
 
-  before_validation :strip_white_space
+  before_validation :strip_white_space, :generate_fingerpint
 
   validates :title, presence: true, length: { within: 0..255 }
   validates :key, presence: true, length: { within: 0..5000 }, format: { with: /\A(ssh|ecdsa)-.*\Z/ }, uniqueness: true
-  validate :fingerprintable_key
+  validates :fingerprint, uniqueness: true, presence: { message: 'cannot be generated' }
 
   delegate :name, :email, to: :user, prefix: true
 
@@ -33,15 +33,6 @@ class Key < ActiveRecord::Base
     self.key = key.strip unless key.blank?
   end
 
-  def fingerprintable_key
-    return true unless key # Don't test if there is no key.
-
-    unless generate_fingerpint
-      errors.add(:key, "can't be fingerprinted")
-      false
-    end
-  end
-
   # projects that has this key
   def projects
     user.authorized_projects
@@ -54,6 +45,9 @@ class Key < ActiveRecord::Base
   private
 
   def generate_fingerpint
+    self.fingerprint = nil
+    return unless key.present?
+
     cmd_status = 0
     cmd_output = ''
     Tempfile.open('gitlab_key_file') do |file|
@@ -66,9 +60,6 @@ class Key < ActiveRecord::Base
       cmd_output.gsub /([\d\h]{2}:)+[\d\h]{2}/ do |match|
         self.fingerprint = match
       end
-      true
-    else
-      false
     end
   end
 end
diff --git a/spec/models/key_spec.rb b/spec/models/key_spec.rb
index fcf2cb9f30d257cd027d0f409350fead63830f84..f4dd726331aefd5a61ce216a212f5377899b6263 100644
--- a/spec/models/key_spec.rb
+++ b/spec/models/key_spec.rb
@@ -42,10 +42,17 @@ describe Key do
       build(:key, user: user).should be_valid
     end
 
-    it "does not accepts the key twice" do
+    it "does not accept the exact same key twice" do
       create(:key, user: user)
       build(:key, user: user).should_not be_valid
     end
+
+    it "does not accept a duplicate key with a different comment" do
+      create(:key, user: user)
+      duplicate = build(:key, user: user)
+      duplicate.key << ' extra comment'
+      duplicate.should_not be_valid
+    end
   end
 
   context "validate it is a fingerprintable key" do